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 Q对象中查找最新日期

使用带有外键的 Q 对象定义 django 查询集

Django-create 过滤器基于使用 Q 对象和 if elif 条件的每个字段

带有 Q 对象的查询集的 Django 优化

是否可以在 Django 1.5.1 中将动态属性与 Q 对象一起使用?

在Django中使用Q()对象