Django ORM relatedmanager добавляет настройки по умолчанию к фильтрам - PullRequest
1 голос
/ 26 марта 2019

Неожиданные фильтры в SQL для связанного менеджера.Похоже, что фильтры находятся в тех полях, где я установил значение по умолчанию в их объявлении в модели.

Мы обновились с Python 2.7 / Django 1.8 до Python 3.6 / Django 2.1 и начали видеть это неожиданное поведениев наших запросах ORM.

Учитывая модели

JobResponseGroup
 - respondent

JobResponse
 - job_response_group
 - job_info_request
 - answer
 - audofile
 - videofile
 - imagefile

JobInfoRequest
 - question_text
 - internal_question (default=0)
print(jrg.jobresponse_set.filter(pk=1).values('id').query)

SELECT 
"job_jobresponse"."id" 

FROM 
"job_jobresponse" 
INNER JOIN "jobInfoRequest" ON ("job_jobresponse"."jobInfoRequest_id" = "jobInfoRequest"."id") 

WHERE (((NOT ("job_jobresponse"."audioFile" =  AND "job_jobresponse"."audioFile" IS NOT NULL) AND "job_jobresponse"."audioFile" IS NOT NULL) OR (NOT ("job_jobresponse"."videoFile" =  AND "job_jobresponse"."videoFile" IS NOT NULL) AND "job_jobresponse"."videoFile" IS NOT NULL) OR (NOT ("job_jobresponse"."imageFile" = ) AND "job_jobresponse"."imageFile" IS NOT NULL) OR (NOT ("job_jobresponse"."imageFile2" = ) AND "job_jobresponse"."imageFile2" IS NOT NULL)) AND "jobInfoRequest"."internalQuestion" = 0 AND 

"job_jobresponse"."group_id" = 16212728 
AND "job_jobresponse"."id" = 1
)

Если у меня есть только одна группа ответа на вакансию, и я ищу ее ответ и ID для1, почему все остальные биты там фильтруются по внутреннему запросу, imageFile, audioFile и т. Д.

Я ищу ответы в заметках о выпуске django, но они появляются пустыми.Надеюсь, кто-то, кто обновился с 1.8 до 2.1, столкнулся с этим и может мне помочь?

1 Ответ

2 голосов
/ 27 марта 2019

Как указано в комментариях к исходному вопросу, проблема возникла по заказу указанных менеджеров. Был пользовательский Manager(), который использовался для фильтрации мультимедиа, и он каким-то образом попал в список до значения по умолчанию objects = models.Manager()

Как указано в документации для Model._default_manager:

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

Таким образом, исправление меняло менеджеров в модели с ...

medias = CustomMediaManager()
objects = models.Manager()

до ...

objects = models.Manager()
medias = CustomMediaManager()
...