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可以遇到这个问题并能帮助我吗?
答案 0 :(得分:2)
如对原始问题的注释中所指定,该问题是由于指定管理员的顺序引起的。有一个自定义Manager()
用于过滤媒体,并以某种方式在默认objects = models.Manager()
如Model._default_manager
的文档中所述:
...第一个Django Manager Manager遇到(按在模型中定义的顺序)具有特殊状态...
因此,修复程序正在将模型中的经理从...更改为
medias = CustomMediaManager()
objects = models.Manager()
到...
objects = models.Manager()
medias = CustomMediaManager()