2010-03-15 18 views
6

Hay İlişkiler hakkında bir sorum var.django ManyToMany yardımı ile

Kullanıcıların Arkadaşlık yapmasını istiyorum. Yani bir Kullanıcı başka bir Kullanıcı ile bir arkadaş olabilir. Bir Dostluk tablosu aracılığıyla ManyToManyField'ı kullanmam gerekeceğini farz ediyorum. Ama işe yaramayacağım. Herhangi bir fikir?

İşte benim modelleri.

class User(models.Model): 
    username = models.CharField(max_length=999) 
    password = models.CharField(max_length=999) 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 
    friends = models.ManyToManyField('self') 
    pendingFriends = models.ManyToManyField('self', through='PendingFriendship', symmetrical=False, related_name='friend_requested') 

class PendingFriendship(models.Model): 
    user = models.ForeignKey('User', related_name='user') 
    requested_friend = models.ForeignKey('User', related_name='requested_friend') 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 

Teşekkür

cevap

6

Birçok çoğa alan documentation açıklanmıştır. Sadece yapın: Yalnızca ilişki için ekstra alanlar eklemek istiyorsanız through kullanmak zorunda

class User(models.Model): 
    username = models.CharField(max_length=999) 
    password = models.CharField(max_length=999) 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 
    friends = models.ManyToManyField('self') 

. Tüm olasılıkların bir başka tarifi this section'da açıklanmıştır.

Modelinizi Kullanıcı olarak adlandırdığınızda, yapı doğrulama kimlik doğrulama çerçevesini kullanmıyorsunuzdur. Fakat bunu kullanırsanız, kimlik doğrulamasını kendiniz uygulamak zorunda değilsiniz, bu yüzden düşünün.

Güncelleme: Bağlandığım bölümleri okudunuz mu? Orada açıklanır

  • Kişisel ara model birini içermelidir - ve tek - Hedef modeline yabancı anahtar (bu Kişi olacaktır: orta modeline bir takım sınırlamalar vardır

    bizim örneğimiz). Birden fazla yabancı anahtarınız varsa, bir doğrulama hatası ortaya çıkar.

  • Ara modeliniz, kaynak modele bir ve sadece bir - yabancı anahtar içermelidir (bu bizim örneğimizde Grup olacaktır). Birden fazla yabancı anahtarınız varsa, bir doğrulama hatası ortaya çıkar.
  • Bunun tek istisnası, bir aracı model aracılığıyla, kendisiyle çoktan çoğa ilişkisi olan bir modeldir. Bu durumda, aynı modele iki yabancı anahtar izin verilir, ancak çoktan çoğa ilişkisinin iki (farklı) tarafı olarak ele alınacaktır.
  • Modele göre çoktan çoğa ilişkisi tanımlarken, bir ara model kullanarak, symmetrical=False'u kullanmalısınız (bkz. model field reference).
+0

Örneği, değiştirdiğinizle güncelledim. Ancak hala verileri tutmak için ekstra tabloya ihtiyacım var. – dotty

+0

@dotty: Cevabımı güncelledim. –

+1

hmm, modelimi güncelledim, doğrulama geçer iyi. Ive birkaç Kullanıcı ekledi. ve kullanıcı A modelinde bir BekleyenFriendship nesnesi oluşturdu.Bu arkadaşlığın güzelliğini ekler, ancak kullanıcı b'nin nesnesi arkadaşlığın öteki tarafını alamaz ('simetrik' değer yanlış olduğundan dolayı). İlişkinin de simetrik olmasını istiyorum. herhangi bir fikir? – dotty

0

This blog neye ihtiyacınız açıklıyor. blogdan, sadece bu satırda related_name değiştirmek zorunda:

pendingFriends = models.ManyToManyField('self', through='PendingFriendship', symmetrical=False, related_name='friend_requested') 

içine:

related_name='friend_requested+' 

Ancak, ben yine de otomatik olarak simetrik ilişkileri yaratma çalışması için alınamıyor.

İlgili konular