2009-07-12 61 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 

我可以这样做:Django的:如何遵循ForeignKey的( '自我')向后

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

这是伟大的。但是,我如何获得所有的孩子?

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

不起作用(可能应该有更多的表示法),并且在搜索时没有看到太多。

可能吗?落入SQL?

回答

16

默认情况下,Django会调用逆转的型号名称,其次是“_set”,所以这将是

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

如果不适合你,使用related_name可选参数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

太棒了。效果很好。会再次购买。 A ++ – 2009-07-12 01:33:45

1

不知道这是不是最好的方式,但是这也能够完成任务

Achievement.objects.filter(parent_achievement=1) 

Achievement.objects.filter(parent_achievement__pk=1)