2012-06-26 10 views
48

Załóżmy mam ten model:Czy mogę uczynić z klucza obcego tego samego modelu w django?

class Task(models.Model): 
    title = models.CharField() 

teraz chciałbym, że to zadanie może być odnosi się do innego zadania. Tak więc chciałem zrobić to:

class Task(models.Model): 
    title = models.CharField() 
    relates_to = ForeignKey(Task) 

Jednak mam błąd, który stwierdza, że ​​zadanie jest określone notatką. Czy to "legalne", jeśli nie, jak mam zrobić coś podobnego do tego?

+0

Jeśli nie chcesz 'relates_to' podłączenia się do siebie, patrz http://stackoverflow.com/q/37946885/247696 – Flimm

Odpowiedz

93
class Task(models.Model): 
    title = models.CharField() 
    relates_to = models.ForeignKey('self') 

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

+1

dokładnie zaledwie kilka sekund szybciej :-) –

+0

dobry pomysł z użyciem' self "zamiast" Task "! –

+1

Załóżmy, że używam czegoś takiego i chcę usunąć zadania. Ponieważ każda instancja zadania ma klucz obcy do innej instancji zadania, jeśli usunę jedną instancję zadania, czy Django automatycznie usunie kaskadowo, aby automatycznie usuwać wszelkie instancje zadań wskazujące zadanie, które właśnie usunąłem? Innymi słowy, czy CASCADE DELETE nadal działa w tym samym modelu? – Marc

15

Tak można zrobić, dokonać ForeignKey atrybut ciąg:

class Task(models.Model): 
    title = models.CharField() 
    relates_to = ForeignKey('Task') 

W głębi, można również krzyż odniesienia aplikacji na modelu za pomocą notacji z kropkami, na przykład

class Task(models.Model): 
    title = models.CharField() 
    relates_to = ForeignKey('<app_name>.Task') # e.g. 'auth.User' 
Powiązane problemy