2012-12-20 25 views
16

başvuru Aşağıdaki kod var:sahip Nasıl iki model birbirini Django

class Game(models.Model): 
    title = models.CharField(max_length=50) 
    summery = models.CharField(max_length=500) 
    key = models.IntegerField() 
    pin = models.CharField(max_length=12) 
    complete = models.BooleanField() 
    invite_sent = models.DateTimeField() 
    on = models.ForeignKey(Member, blank = True) #<---- 


class Member(models.Model): 
    email = models.CharField(max_length=100) 
    color = models.CharField(max_length=11) 
    game = models.ForeignKey(Game) #<---- 

üyelerinden birine yabancı anahtar bağlantıları (var öyle teslim edenlerin) "açık". Bir oyunun tüm üyeleri, üzerinde bulundukları oyuna "oyun" yabancı anahtarını ayarladılar. Sorun şu ki, Django ilan edilmeden önce bir sınıfa başvurmama izin vermiyor ve aynı anda bunları bildiremediğimden ...

Düzenleme: Bir şeyleri temizlemek için, işte bir örnek. Bir oyun oynarken beş üye olsaydı, beşinin hepsinin de oyuna yabancı anahtarları olurdu. Diğer yandan oyunun, kendisine dönüşen belirli üyeye bir yabancı anahtarı olur.

+3

burada uygun olmayabilir olabilir, ama genel olarak, size adını geçirerek henüz ilan etmedik bir sınıfa bir ForeignKey oluşturabilir Sınıfın kendisi yerine bir dize olarak sınıf. – mipadi

cevap

29

Django documentation for the ForeignKey field devletler: Henüz tanımlanmamış bir model üzerinde bir ilişki oluşturmak gerekiyorsa

, modele ziyade modeli nesnenin kendisinin adı kullanabilirsiniz.

senin durumunda Yani

, olurdu:

class Game(models.Model): 
    # Other fields... 
    on = models.ForeignKey('Member', blank = True) 

class Member(models.Model): 
    # Other fields... 
    game = models.ForeignKey(Game) 
+2

Bana, "ForeignKey", "OneToOneField" ve "ManyToManyField" için "app.model" gösterimini kullanarak sürekli olarak çok iyi bir uygulama. Bunu, model dosyalarını model başına bir dosyaya bölmek için kullandım. Bu da çok daha okunabilir. –

+0

@SteveK Bu, dairesel bir ithalat problemini çözmemde bana yardımcı oldu, teşekkürler! – OrPo

+0

Bu ilişkiyi "null = False" varsayılan argümanları dikkate alınarak nasıl kaydederdiniz? – jozxyqk

8

İki modelin birbirine yabancı anahtarlar ile başvurmasına gerek yoktur. Bir oyun daha olabilir, oysa

on = models.ForeignKey(Member, blank = True) #<---- 

ve mantıksal Member s 'ler yine farklı Game ilişkisi kesilir' (ve üyesi her seferinde bir oyuna ait olabilir, çünkü bu daha mantıklı: çizgisini kaldır bir üyeden).

Belirli bir oyunda hangi üyelerin olduğunu öğrenmek için reverse relation kullanabilirsiniz.

+1

Muhtemelen durumumu netleştirmedim (veya belki cevabınızı anlamıyorum). Her biri bir oyun oynayan 5 üye varsa, hepsi aynı oyuna başvururlardı. Fakat "on" yabancı anahtar, sadece onu çeviren kişilere (tek bir üye) atıfta bulunacaktır. –

İlgili konular