Есть ли способ противостоять ненужным соединениям, которые проверяют только наличие идентификатора при использовании Django's orm?

В примере. Если у меня есть модель Person, у которой есть материнское поле, которое является внешним ключом ... Мне приходит следующее:

p = Person.object.get(id=1)
if p.mother_id:
    print "I have a mother!"

В приведенном выше примере мы отправили один запрос. Я обманом заставил Django не получать мать, используя поле _id вместо mother.id. Но если бы я отфильтровал всех, у кого нет матери:

Person.objects.filter(mother=None)
Person.objects.filter(mother__id=None)
Person.objects.filter(mother__isnull=True)
Person.objects.filter(mother__id__isnull=True)

Все они без необходимости объединяются в связанной таблице ... и я не могу ссылаться на столбцы _id, потому что они не поля ... так что либо из следующих ошибок:

Person.objects.filter(mother_id__isnull=True)
Person.objects.filter(mother_id=None)

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

Заранее спасибо.

Изменить (ответили): Благодарим Бернд, который прокомментировал ответ Дэниела, но оказалось, что этот обходной путь отлично подходит для возвращения людей без матерей, без ненужного соединения:

Person.objects.exclude(mother__isnull=False)

Редактировать (подробнее):

Я также должен упомянуть, что я Я обнаружил, что такое поведение действительно только поднимает голову, когда отношение FK допускает значение NULL. Странно, но факт.

6
задан royal 9 November 2010 в 16:18
поделиться