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 模型结构中。 (工作安全清单应用程序)