我有这两个查询:
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'))
有人可以告诉我哪里出错了
答案 0 :(得分:1)
第一种方法中的错误是因为gifts1和gift已经QuerySets(尝试typeof(赠品)),所以你不能使用|它们之间。就像你使用'hi'|'再见'一样。你只使用| Q objects。
你第二次做的几乎是正确的,除了语法:use |对于OR和&为AND。逗号不对Q提供任何逻辑操作,导致过滤器上的参数不同,从而导致错误。
请注意,使用&加入过滤器在Django中是相同的(或者应该是),但是第一种将gift和gift1作为不同的QuerySet并进行评估的方法是不同的:这种方法导致对数据库的两次访问(命中),同时加入过滤器或单个过滤器only hits it once中的Q对象。
根据经验,您应该尽量减少db的命中数。
希望这有帮助