【问题标题】:Django Q object query filtering with multiple conditions failing具有多个条件的 Django Q 对象查询过滤失败
【发布时间】:2018-06-17 10:22:02
【问题描述】:

我正在尝试将多个条件应用于我的过滤器。模型是这样的

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 正确,我知道数据库中只有一项。但是,此查询始终返回一个空项目。任何建议为什么这是错误的以及如何解决它?

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    我不能确定这是否是问题所在,因为您忘记显示您在数据库中的真实内容,但在这里:

    (Q(destination=modelEmployerDestinationInstance) |   Q(destination=modelEmployerDestinationInstance))
    

    我假设你想要:

    (Q(source=modelEmployerDestinationInstance) |   Q(destination=modelEmployerDestinationInstance))
    

    相反...

    请注意,使用较短的名称,即sourcedestination 而不是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”,您有四个单词要解析,并且名称中唯一独特(因此相关)的部分位于第三位,您的大脑往往会跳过这部分。 “模型”、“雇主”和“实例”部分实际上只是噪音。

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 2020-06-19
      • 2015-10-28
      • 1970-01-01
      • 2020-04-16
      • 2021-07-05
      • 1970-01-01
      • 2020-06-16
      • 2014-03-22
      相关资源
      最近更新 更多