Django обновить фильтр / prefetch_related изменение поведения? - PullRequest
0 голосов
/ 27 сентября 2018

Я нахожусь в процессе обновления с Django 1.8.19 до 1.11.15, и я нашел фрагмент кода, который ломается.

В частности, этот запрос делает что-то отличное от того, что онделал раньше.

project_groups = brand.project_groups.prefetch_related(
   'project', 'project__score', 'project__themes').filter(
   project=projects
).distinct()

Ранее (в Django 1.8), согласно выводу "project_groups.query", он генерировал SQL, включая:

... projectgroup.project_id IN [projects query]

Теперь он производит чтение SQL:

... projectgroup.project_id = [projects query]

Это прерывается, поскольку [проектный запрос] возвращает более одной строки.Поэтому я получаю:

ProgrammingError: more than one row returned by a subquery used as an expression

Единственные изменения, которые я внес в код для этого обновления, касаются моделей и миграций для использования ArrayField и HStoreField из django.contrib.postgres.fields вместо django_hstore эквивалентов.

Я предполагаю, что исходный код был неправильным, но работал из-за ошибки в Django (filter / prefetch_related), которая теперь исправлена.Это может быть правильно?Если это на самом деле новая ошибка в Django, я не хочу писать код, который зависит от него!

1 Ответ

0 голосов
/ 28 сентября 2018

Произошло изменение в поведении Django при поиске в поле между 1,8 и 1,9, что объясняет это - подробности вы можете найти на Django ticket # 25284 .

В Django 1.8 запрос, такой как Model.objects.filter(related_id = RelatedModel.objects.all()), использовался для неявного поиска __ в , поэтому запрос SQL содержал related_id IN (SELECT id FROM ...).Но в Django 1.9 «IN» изменяется на «=», что приводит к разрыву запроса в MySql и Postgres.Это изменение было классифицировано как исправление ошибки, поскольку неявное поведение «IN» было недокументированным и, вероятно, случайным.* - см. Документация Django: полевые поиски

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