2015-11-25 8 views
2

Jello!Django - выберите модель, связанная с самим собой

Я работаю с django прямо сейчас, и у меня есть проблема, которая, как я подозреваю, имеет простое решение, но у меня было много трудностей с ее поиском (большинство ключевых слов, как правило, указывают google на неправильные места).

Я ищу, чтобы отфильтровать запрос на основе критериев, которые: Модель имеет поле, которое указывает на себя.

Я приведу пример:

class Person(models.Model): 
    name = models.CharField(max_length=20) 
    parent = models.ForeignKey('app.Person', null=True) 

gramps = Person.objects.create(name='Tod', parent=None) 
pops = Person.objects.create(name='Hank', parent=gramps) 
sonny_boy = Person.objects.create(name='Tim', parent=pops) 

temporal_paradox_dude = Person.objects.create(name='Emmett') 
temporal_paradox_dude.parent = temporal_paradox_dude 
temporal_paradox_dude.save() 

temporal_paradox_dude_2 = Person.objects.create(name='Arnold') 
temporal_paradox_dude_2.parent = temporal_paradox_dude_2 
temporal_paradox_dude_2.save() 

Таким образом, вопрос, в этом случае, как я могу запросить Person таблицу только людей, которые временно парадоксальным?

>>> Person.objects.filter(parent=SOME_WAY_OF_DECLARING_ITSELF) 
[ 'Emmett', 'Arnold' ] 

Что мне нужно сделать, чтобы заменить SOME_WAY_OF_DECLARING_ITSELF с тем чтобы получить модели, которые ссылаются на себя?

Спасибо!

ответ

1

Я думаю, вы ищете что-то подобное;

from django.db.models import F 

Person.objects.filter(parent_id=F('id')) 
+0

https://docs.djangoproject.com/en/1.7/ref/models/queries/ –

+0

I Поверьте, это очень то, что я ищу! Не могли бы вы быстро объяснить, почему в вашем примере это 'parent_id' вместо' parent'? Мне кажется, что он должен по крайней мере быть «parent__id». –

+0

parent_id - это имя прямого столбца в таблице. –

0

Вы можете сделать простой запрос, а затем процеживают перебирая этого запроса:

results = [x for x in Person.objects.all() if x.parent == x] 
+0

Это будет работать, но будет запрашивать всю таблицу (если в таблице есть миллионы записей «Личность», это было бы неприемлемо) –