2009-07-12 5 views
10
class Achievement(MyBaseModel): 
    parent_achievement = models.ForeignKey('self', blank=True, null=True, help_text="An achievement that must be done before this one is achieved") # long name since parent is reserved 

que je peux faire:Django: Comment suivre ForeignKey ('moi') vers l'arrière

Achievement.objects.get(pk="1").parent_achievement 

qui est grand. Mais comment puis-je avoir tous les enfants?

Achievement.objects.get(pk="1").parent_achievement_set 

ne fonctionne pas (et devrait probablement avoir plus de notation autour de lui), et je n'ai pas vu trop lors de la recherche.

Est-ce possible? Tomber en SQL?

Répondre

16

Par défaut, django appellera l'inverse le nom du modèle, suivi de « _set », il serait donc

Achievement.objects.get(pk="1").achievement_set 

Si cela ne vous convient pas, utilisez le related_name argument optionnel pour models.ForeignKey:

class Achievement(MyBaseModel): 
    parent_achievement = models.ForeignKey(
     'self', 
     blank=True, 
     null=True, 
     help_text="An achievement that must be done before this one is achieved", 
     related_name="child_achievement_set" 
    ) # long name since parent is reserved 

Achievement.objects.get(pk="1").child_achievement_set 
+7

merveilleux. a bien fonctionné. achèterait encore. A ++ –

1

Je ne sais pas si cela est la meilleure façon, mais cela devient aussi le travail

Achievement.objects.filter(parent_achievement=1) 

ou

Achievement.objects.filter(parent_achievement__pk=1) 
Questions connexes