0

我有这两个查询:

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我会收到以下错误:

错误用户定义函数引发异常

如果我使用这样的 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'))

有人可以告诉我我哪里错了吗

4

1 回答 1

1

第一种方法的错误是因为gifts1和gifts已经是QuerySets(尝试typeof(gifts)),所以不能使用| 它们之间。就像你在使用'hi'|'goodbye'。您只使用 | 对于Q 对象

你第二次做的几乎是正确的,除了语法:use | 用于 OR 和 & 用于 AND。逗号不提供对 Q 的任何逻辑操作,导致过滤器上的参数不同,从而导致错误。

请注意,在 Django 中使用 & 和加入过滤器是等效的(或者应该是等效的),但是您将 gift 和 gift1 作为不同的 QuerySet 并评估它们的第一种方法是不同的:该方法导致对数据库的两次访问(命中) ,而在单个过滤器中加入过滤器或 Q 对象只会命中一次

根据经验,您应该尽量减少对 db 的点击次数。

希望这可以帮助

于 2013-06-04T12:07:57.867 回答