Django ORM相关经理向过滤器添加了默认设置

时间:2019-03-26 20:28:00

标签: django filter orm django-queryset

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 个答案:

答案 0 :(得分:2)

如对原始问题的注释中所指定,该问题是由于指定管理员的顺序引起的。有一个自定义Manager()用于过滤媒体,并以某种方式在默认objects = models.Manager()

之前列出了它。

Model._default_manager的文档中所述:

  

...第一个Django Manager Manager遇到(按在模型中定义的顺序)具有特殊状态...

因此,修复程序正在将模型中的经理从...更改为

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

到...

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