代码之家  ›  专栏  ›  技术社区  ›  Rajeshwar

多条件django q对象查询过滤失败

  •  0
  • Rajeshwar  · 技术社区  · 7 年前

    我正在尝试对过滤器应用多个条件。模型看起来像这样

    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)
    

    最初,我试图获得一个基于工作的涉及两方的聊天实例。在某一点上,源可以是目标,有时目标可以是源。但工作还是一样的。

    这就是我的问题

    querySet = modelChat.objects.filter(
                          (Q(source=modelEmployerSourceInstance) | Q(destination=modelEmployerSourceInstance))
                                          &
            (Q(destination=modelEmployerDestinationInstance) | Q(destination=modelEmployerDestinationInstance))
                                          &
                                  Q(job_id=job_id)
                                           )
    

    作业ID正确,我知道数据库中只有一项。但是,此查询总是返回空项。有什么建议,为什么这是错误的,以及我如何修复它?

    1 回复  |  直到 7 年前
        1
  •  1
  •   bruno desthuilliers    7 年前

    我不能肯定这是否是问题所在,因为你忘了在数据库中显示你真正拥有的东西,但这里:

    (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”,您有四个要解析的单词,并且名称中唯一的独特(因此相关)部分位于第三个位置,您的大脑倾向于跳过这一部分。“模型”、“雇主”和“实例”部分实际上只是噪音。