Джанго: Как следовать за ForeignKey («я») задом наперед - PullRequest
10 голосов
/ 12 июля 2009
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

Я могу сделать:

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

что отлично. Но как мне получить всех детей?

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

не работает (и, вероятно, должно иметь больше обозначений), и я не видел слишком много при поиске.

Возможно ли это? Попасть в SQL?

Ответы [ 2 ]

16 голосов
/ 12 июля 2009

По умолчанию 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
1 голос
/ 14 июля 2009

Не знаю, является ли это лучшим способом, но это также делает работу

Achievement.objects.filter(parent_achievement=1)

или

Achievement.objects.filter(parent_achievement__pk=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...