Django Q 对象不工作

Posted

技术标签:

【中文标题】Django Q 对象不工作【英文标题】:Django Q object not working 【发布时间】:2015-03-14 21:22:25 【问题描述】:

我想使用 Django 过滤器进行 or 查询。我的代码看起来很简单,但它不起作用。我已经阅读了很多答案,但对我没有任何帮助。有什么问题?

from django.db.models import Q
from models import Processoren

cpu = [
    "Intel",
    "AMD"
]

queryset = Processoren.objects.filter(Q(naam__contains=cpu[0]) | Q(naam__contains=cpu[1]))

#queryset = Processoren.objects.filter(naam__contains=cpu[0])

print queryset

注释的代码行可以正常工作,但上面的代码行不行。

这里是 Q 对象的文档:https://docs.djangoproject.com/en/1.7/topics/db/queries/#complex-lookups-with-q-objects

这里有一个相关的问题,但这对我不起作用: How to use OR using Django's model filter system?

出了什么问题或者我忘记了什么?

【问题讨论】:

和mongoengine有什么关系? Processoren 是 mongoengine 模型吗? @Ross 这是来自 models.py 的模型 一个 Django 模型或一个 MongoEngine 模型 - 区别在于 MongoEngine 不支持 Django Q 但一个 django 模型应该支持。 【参考方案1】:

此代码按预期工作。它会产生非常正确的 SQL 查询:

SELECT "app_processoren"."id", "app_processoren"."naam"
FROM "app_processoren"
WHERE ("app_processoren"."naam" LIKE '%Intel%' OR
       "app_processoren"."naam" LIKE '%AMD%')

您的数据有问题。您确定存在naam='AMD' 的记录吗?可能他们有不同的情况(例如“Amd”)?试试__icontains 而不是普通的__contains

【讨论】:

感谢您的宝贵时间。是的,我确信这行得通,因为这条线可以正常工作:queryset = Processoren.objects.filter(naam__contains=cpu[0]) 如果我这样做:cpu[1],我也尝试了 icontains。那么我们可以排除数据是对的吗?

以上是关于Django Q 对象不工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 Q-Objects 在 Django 中动态构建复杂查询

django - 如果一个或多个字段不存在则不断言的 Q 对象

卡在 Django 中的 App DB 模型结构中。 (工作安全清单应用程序)

如何使用相同的 django 表单编辑/添加对象?

Django 查询:返回一个将转换为“AND (...)”的 Q 对象

Django ORM:相当于 SQL `NOT IN`? `exclude` 和 `Q` 对象不起作用