【问题标题】:How to implement logical AND and OR operator in one query using django如何使用 django 在一个查询中实现逻辑 AND 和 OR 运算符
【发布时间】:2020-05-18 07:08:56
【问题描述】:

我希望在我的 Django 查询中实现 AND 和 OR 逻辑,但在检查了很多帖子和搜索后,我发现我无法在同一个查询过滤器中实现 AND-OR 逻辑。

这是我想要实现的目标

我想获取具有关键 ABC AND 值 Value1 OR Values2 OR Values3 AND 关键 CDE AND 值 Value4 的记录

我正在使用python3.6, django1.11, mongoengine, and MongoDB

filter =  [ { "Key": "ABC", "Values": ["Value1", "Value2", "Value3"]}, { "Key": "CDE", "Values": ["Value4"]} ]

回复:

[  
    {
        "_id" : ObjectId("5ebd29286310619f046ba866"),
        "account_id" : "12",
        "key" : "ABC",
        "Value" : "Value1"
    }

    {
        "_id" : ObjectId("5ebd29286310619f046ba866"),
        "account_id" : "12",
        "key" : "ABC",
        "Value" : "Value2"
    }

    {
        "_id" : ObjectId("5ebd29286310619f046ba866"),
        "account_id" : "12",
        "key" : "ABC",
        "Value" : "Value3"
    }

    {
        "_id" : ObjectId("5ebd29286310619f046ba866"),
        "account_id" : "12",
        "key" : "CDE",
        "Value" : "Value4"
    }

]

这是我已经尝试过但出现错误mongoengine.errors.InvalidQueryError: Cannot resolve field "key"

from mongoengine.queryset.visitor import Q
records = MyModel.objects.get(Q(key__exact='ABC'),
    Q(Value__exact='Value1') | Q(Value__exact='Value2') | Q(Value__exact='Value3', Q(key__exact='CDE'), Q(Value__exact='Value4')))

【问题讨论】:

    标签: django python-3.x mongoengine


    【解决方案1】:

    您可以使用Q 对象,在docs 中提到。举个例子:

    Poll.objects.get(
        Q(question__startswith='Who'),
        Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
    )
    

    这段代码相当于:

    SELECT * from polls WHERE question LIKE 'Who%'
        AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
    

    【讨论】:

    • 嗨@Deniz 感谢您的回复,我已经尝试过了,但出现错误。
    • 我已经添加了我尝试过的代码,请注意我使用的是 mongoengine Q 和 Django Q
    • 我认为是关于'Key'的大写'K',你可以试试Q(Key__exact='CDE')吗?
    • 但是我 DB 我有字段键和键,我试过这个也不起作用,
    • 如错误所示,关键字段不匹配。也许您的模型定义和数据库方案不一样。它可能会导致此错误。这个答案可能会对您有所帮助:stackoverflow.com/a/25515226/2474573
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多