django:使用 Q 对象
Posted
技术标签:
【中文标题】django:使用 Q 对象【英文标题】:django : using Q objects 【发布时间】:2013-05-30 15:25:27 【问题描述】:我有这两个问题:
gifts = Products.objects \
.filter(entry_query,in_stock__icontains='A-in') \
.filter(~Q(title__icontains='Not Found'))
和
gifts1 = Products.objects \
.filter(('city__name__iregex', 'Delhi'),in_stock__icontains='A-in') \
.filter(~Q(title__icontains='Not Found'))
如果我这样做gifts = gifts | gifts1
,我会收到以下错误:
error 用户定义函数引发异常
如果我像这样使用 Q 对象:
gifts = Products.objects \
.filter((Q(entry_query) & Q(in_stock__icontains='A-in')) | Q(('city__name__iregex', 'Delhi'),in_stock__icontains='A-in') ) \
.filter(~Q(title__icontains = 'Not Found'))
我又遇到同样的错误
这里的入口查询是
(OR: ('title__iregex', u'bag'), ('description__iregex', u'bag'),('source_website_url__iregex', u'bag'))
谁能告诉我哪里出错了
【问题讨论】:
【参考方案1】:第一种方法的错误是因为gifts1和gifts已经是QuerySets(尝试typeof(gifts)),所以不能使用|它们之间。就像你在使用'hi'|'goodbye'。您只使用 |对于Q objects。
你第二次做的几乎是正确的,除了语法:use |用于 OR 和 & 用于 AND。逗号不提供对 Q 的任何逻辑运算,导致过滤器上的参数不同,从而导致错误。
请注意,在 Django 中使用 & 和加入过滤器是等效的(或者应该是等效的),但是您将 gift 和 gift1 作为不同的 QuerySet 并评估它们的第一种方法是不同的:这种方法会导致两次访问(命中)到数据库,同时在单个过滤器 only hits it once 中加入过滤器或 Q 对象。
根据经验,您应该尽量减少对 db 的点击次数。
希望对你有帮助
【讨论】:
以上是关于django:使用 Q 对象的主要内容,如果未能解决你的问题,请参考以下文章
Django-create 过滤器基于使用 Q 对象和 if elif 条件的每个字段