多个条件失败的Django Q对象查询过滤
Django Q object query filtering with multiple conditions failing
我正在尝试对我的过滤器应用多个条件。模型看起来像这样
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)
)
job id 正确,我知道数据库中只有一项。但是,此查询总是 returns 返回一个空项。为什么这是错误的以及如何解决它有什么建议吗?
我不能确定这是否是问题所在,因为您忘记显示您在数据库中真正拥有的内容,但在这里:
(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",您有四个词要解析,并且名称中唯一与众不同(因此相关)的部分位于第三位,您的大脑往往会跳过这部分。 "model"、"Employer" 和 "Instance" 部分实际上只是噪音。
我正在尝试对我的过滤器应用多个条件。模型看起来像这样
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)
)
job id 正确,我知道数据库中只有一项。但是,此查询总是 returns 返回一个空项。为什么这是错误的以及如何解决它有什么建议吗?
我不能确定这是否是问题所在,因为您忘记显示您在数据库中真正拥有的内容,但在这里:
(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",您有四个词要解析,并且名称中唯一与众不同(因此相关)的部分位于第三位,您的大脑往往会跳过这部分。 "model"、"Employer" 和 "Instance" 部分实际上只是噪音。