我正在尝试将多个条件应用于我的过滤器。该模型看起来像这样
class modelChat(models.Model):
source = models.ForeignKey(modelEmployer,related_name = 'rsource',on_delete=models.CASCADE,null=True,default=None,blank=True)
job = models.ForeignKey(modelJob,on_delete=models.CASCADE,null=True,default=None,blank=True)
destination = models.ForeignKey(modelEmployer,related_name = 'rdestination',on_delete=models.CASCADE,null=True,default=None,blank=True)
最初我正在尝试获取一个涉及基于工作的2方的聊天实例。在某一点,源可以是目的地,有时目的地可以是源。但工作仍然是一样的。
这就是我的查询
querySet = modelChat.objects.filter(
(Q(source=modelEmployerSourceInstance) | Q(destination=modelEmployerSourceInstance))
&
(Q(destination=modelEmployerDestinationInstance) | Q(destination=modelEmployerDestinationInstance))
&
Q(job_id=job_id)
)
作业ID是正确的,我知道数据库中只有一个项目。但是,此查询总是返回一个空项。有什么建议为什么这是错误的以及如何解决它?
答案 0 :(得分:1)
我不能确定这是否是问题,因为你忘记在数据库中显示你真正拥有的内容但是在这里:
(Q(destination=modelEmployerDestinationInstance) | Q(destination=modelEmployerDestinationInstance))
我假设你想要:
(Q(source=modelEmployerDestinationInstance) | Q(destination=modelEmployerDestinationInstance))
,而不是...
请注意,使用较短的名称(即source
和destination
而不是modelEmployerSourceInstance
modelEmployerDestinationInstance
,逻辑会更明显:
q = (
(Q(source=source) | Q(destination=source))
& (Q(source=destination | Q(destination=destination))
& Q(job_id=job_id)
)
querySet = modelChat.objects.filter(q)
有意义的名字是一件好事,但它们必须足够简短。使用“modelEmployerXXXInstance”,您需要解析四个单词,并且名称中唯一的独特(因此相关)部分位于第三位,您的大脑倾向于跳过此部分。 “模型”,“雇主”和“实例”部分实际上只是噪音。