Django QuerySet получает доступ к полю внешнего ключа напрямую, без принудительного соединения - PullRequest
6 голосов
/ 16 ноября 2010

Предположим, у вас есть модель Entry с полем «автор», указывающим на автора другой модели.Предположим, что это поле может быть пустым.

Если я запустил следующий QuerySet:

Entry.objects.filter (author = X)

Где X - это некоторое значение.Предположим, что в MySQL я установил составной индекс для Entry для некоторого другого столбца и author_id, в идеале я бы хотел, чтобы SQL просто использовал «author_id» в модели Entry, чтобы он мог использовать составной индекс.

Оказывается, что Entry.objects.filter (author = 5) будет работать, соединение не выполняется.Но, если я скажу author = None, Django выполняет соединение с Author, а затем добавляет к предложению Where Author.id IS NULL.Так что в этом случае он не может использовать составной индекс.

Есть ли способ сообщить Django просто проверить pk, а не переходить по ссылке?

Единственный известный мне способ - добавить дополнительный .extra (где = ['author_id IS NULL']) в QuerySet, но я надеялся, что какая-то магия в .filter () сработает.

Спасибо.

(Извините, я не прояснил ранее об этом, и спасибо за ответы от Lazerscience и Джош).

Ответы [ 5 ]

1 голос
/ 16 ноября 2010

Если вы делаете, как вы описали, и не используете select_related() Django не будет выполнять никакого соединения вообще - независимо от того, выполняете ли вы фильтрацию по первичному ключу связанного объекта или самого связанного (что не имеет никакого значения).

Вы можете попробовать:

print Entry.objects.(author=X).query
1 голос
/ 16 ноября 2010

Предполагая, что внешний ключ для Author имеет имя author_id (если вы не указали имя столбца внешнего ключа для поля ForeignKey, это должно быть NAME_id, если вы указали имя, то проверьте определение модели / схема вашей базы данных),

Entry.objects.filter(author_id=value)

должно работать.

1 голос
/ 16 ноября 2010

Это не работает, как ожидалось?

Entry.objects.filter(author=X.id)

Вы можете использовать модель или идентификатор модели в фильтре внешнего ключа. Я пока не могу проверить, выполняет ли это отдельный запрос, хотя я действительно надеюсь, что это не так.

0 голосов
/ 28 октября 2016

Довольно поздно, но я просто столкнулся с этим.Я использую Q объекты для построения запроса, поэтому в моем случае это работало нормально:

~Q(author_id__gt=0)

Это генерирует sql как

NOT ("author_id" > 0  AND "author_id" IS NOT NULL)

Возможно, вы могли бы решить проблемув этом вопросе с помощью

Entry.objects.exclude(author_id__gt=0)
0 голосов
/ 16 ноября 2010

Вторая попытка:

http://docs.djangoproject.com/en/dev/ref/models/querysets/#isnull

Возможно, у вас может быть отдельный запрос, в зависимости от того, является ли X нулевым или нет, если author__isnull?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...