Django

2011-08-03 16 views
100

'da One-To-Many bir ilişki nasıl ifade edilir Şu anda Django modellerini tanımlıyorum ve model alan türlerinde OneToManyField olmadığını fark ettim. Eminim bunu yapmanın bir yolu var, o yüzden ne kaçırdığımı bilmiyorum. O ben Dude sahibi olan PhoneNumber tanıdığımız gerekmez, bu durumdaDjango

class Dude(models.Model): 
    numbers = models.OneToManyField('PhoneNumber') 

class PhoneNumber(models.Model): 
    number = models.CharField() 

, her Dude birden PhoneNumber s olabilir, ancak ilişki tek yönlü olmalıdır: Ben aslında böyle bir şey var haddi zatında, ben örneğin bir Business olarak PhoneNumber örneklerini kendi çok farklı nesneleri sahip olabilir gibidir:

class Business(models.Model): 
    numbers = models.OneToManyField('PhoneNumber') 

ben yerini alacak Ya bu k temsil etmek modelde ile OneToManyField (yok olan) ilişki indeksi?

@OneToMany 
private List<PhoneNumber> phoneNumbers; 

nasıl Django bu ifade edebiliriz: bire-çok ilişki bildirerek nerede kadar kolay oldu Hazırda bekleme/JPA geliyorum?

cevap

67

Django'da Bire Çok İlişkileri işlemek için ForeignKey kullanmanız gerekir.

ForeignKey üzerinde dokümantasyon çok kapsamlı ve elinizdeki tüm sorulara cevap vermelidir:

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

sizin örnekte mevcut yapısı her Dude bir sayı olmasına izin verir, ve her sayı katına ait olduğu Düdenler (İş ile aynı).

Ters ilişkiyi istiyorsanız, PhoneNumber modelinize bir tane Dude ve bir'den Business'a olmak üzere iki ForeignKey alanı eklemeniz gerekir. Bu, her bir sayının bir Dude'ye veya bir İş'e ait olmasını ve Dudes ve Businesses'ın birden fazla Numaraya sahip olmasını sağlayabilir. Sanırım bu senin peşinde olduğun şey olabilir.

class Business(models.Model): 
    ... 
class Dude(models.Model): 
    ... 
class PhoneNumber(models.Model): 
    dude = models.ForeignKey(Dude) 
    business = models.ForeignKey(Business) 
+1

Yukarıdaki problem nedeniyle bana bir örnek verebilir misiniz? Muhtemelen bunu tamamen özlüyorum ama şimdi bir süredir Django belgelerini okudum ve bu tür bir ilişkiyi nasıl yaratacağımı hala açık değil. –

+3

, ForeignKey'lerin her ikisini de gerektirmeyebilir (boş = True, null = True) veya en az bir tane veya diğerinin olduğundan emin olmak için bir çeşit özel doğrulama ekleyin. Genel bir numaraya sahip bir işletmenin durumu nedir? ya da işsiz bir dostum? Özel doğrulama hakkında –

+1

@j_syk iyi nokta. ama hem yabancı bir adama hem de bir yabancıya iş vermek, ve sonra da (model tanımının dışında) doğrulamayı yapmak harikaydı. Daha temiz bir yol olmalı, ama ben de bunu anlayamıyorum. – andy

29

Django'da, bire çok ilişki ForeignKey olarak adlandırılır. ikinci bir özelliği olması geçerli olacak bu yüzden sadece, bir ForeignKey bir başka modeli olabilir

class Dude(models.Model): 
    ... 

class PhoneNumber(models.Model): 
    dude = models.ForeignKey(Dude) 

Birçok modeller gerekir Dude sınıfın bir number niteliğini haiz daha daha çok, ancak, tek yönde çalışır PhoneNumber böyle

o
class Business(models.Model): 
    ... 
class Dude(models.Model): 
    ... 
class PhoneNumber(models.Model): 
    dude = models.ForeignKey(Dude) 
    business = models.ForeignKey(Business) 

Seni d.phonenumber_set.objects.all() ile Dude nesne d için PhoneNumber s erişebilir ve daha sonra bir Business nesne için benzer yapmak.

+1

“ForeignKey” in “bire bir” anlamına geldiği varsayımı altındaydım. Yukarıdaki örneğinizi kullanarak, birçok 'PhoneNumbers' hakkı olan bir Dude 'olmalıdır? –

+4

Cevabımı bunu yansıtmak için düzenledim. Evet. Eğer ForeignKey (Dude, unique = True) 'seçeneğini belirtirseniz' ForeignKey 'sadece bire birdir, bu yüzden yukarıdaki kod ile birden fazla 'PhoneNumber's bir' Dude' alacaksınız. – stillLearning

+1

@rolling stone- teşekkürler, siz yorum yaptığınız gibi hata yaptığımı anladım. Unique = True tam olarak OneToOneField gibi çalışmaz, ForeignKey'in Unique = True değerini belirtirseniz yalnızca bire bir ilişkiyi kullandığını açıklamak istedim. – stillLearning

7

OneToMany ilişkisinin bir çok tarafında (yani, ManyToOne ilişkisi) yabancı anahtarı kullanabilir veya benzersiz bir kısıtlamayla ManyToMany (herhangi bir tarafta) kullanabilirsiniz.