2012-12-20 9 views
16

Mam następujący kod:jak mieć dwa modele odwołać wzajemnie 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) #<---- 

„ON” obcych kluczowych linki do jednego z członków (kto jest kolej). Wszyscy członkowie gry mają ustawiony klucz obcy "gra" do gry, w której się znajdują. Problem polega na tym, że Django nie pozwala mi odwoływać się do klasy przed jej zadeklarowaniem, a ponieważ nie mogę ich zadeklarować jednocześnie ...

Edytuj: Aby wyjaśnić sprawę, oto przykład. Jeśli pięciu graczy grało w jedną grę, wszystkie pięć miało zagraniczne klucze do gry. Z drugiej strony gra miałaby jeden klucz obcy dla danego członka, który nim jest.

+3

nie może być wskazane tutaj, ale w ogóle, można utworzyć ForeignKey do klasy nie zostały jeszcze zgłoszone przez przepuszczenie nazwę klasa jako ciąg zamiast samej klasy. – mipadi

Odpowiedz

29

W Django documentation for the ForeignKey field stany:

Jeśli trzeba utworzyć relację na modelu, który nie został jeszcze zdefiniowany, można użyć nazwy modelu, a nie samego obiektu modelu.

Więc w twoim przypadku, to byłoby:

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

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

Dla mnie ciągłe używanie notacji ''app.model'' dla' ForeignKey', 'OneToOneField' i' ManyToManyField' jest bardzo dobrą praktyką. Użyłem tego do podzielenia plików modeli na jeden plik na model, który jest znacznie bardziej czytelny. –

+0

@SteveK Pomogło mi to rozwiązać problem z okrągłym importem, dzięki! – OrPo

+0

W jaki sposób chciałbyś zachować ten związek, biorąc pod uwagę domyślne argumenty 'null = False'? – jozxyqk

8

Nie ma potrzeby, aby te dwa modele odwoływały się do siebie obcymi klawiszami. Usuń linię:

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

i logicznie twoi Member „s nadal będzie związany z różnymi Game” s (i to ma większy sens, bo członek może należeć do jednej grze na raz, podczas gdy gra może mieć więcej niż jeden członek).

Możesz użyć reverse relation, aby dowiedzieć się, którzy członkowie są w danej grze.

+1

Prawdopodobnie nie wyjaśniłem mojej sytuacji (a może nie rozumiem twojej odpowiedzi). Gdybyśmy mieli 5 członków, grających w jedną grę, wszyscy odnosiliby się do tej samej gry. Ale "włączony" klucz obcy odnosiłby się tylko do osób, które nim obróciły (jeden członek). –

Powiązane problemy