django:使用Q对象

时间:2013-06-04 09:33:06

标签: django django-views django-queryset django-q

我有这两个查询:

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'))

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

1 个答案:

答案 0 :(得分:1)

第一种方法中的错误是因为gifts1和gift已经QuerySets(尝试typeof(赠品)),所以你不能使用|它们之间。就像你使用'hi'|'再见'一样。你只使用| Q objects

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

请注意,使用&加入过滤器在Django中是相同的(或者应该是),但是第一种将gift和gift1作为不同的QuerySet并进行评估的方法是不同的:这种方法导致对数据库的两次访问(命中),同时加入过滤器或单个过滤器only hits it once中的Q对象。

根据经验,您应该尽量减少db的命中数。

希望这有帮助