2013-06-04 49 views
0

我有这两个疑问:Django的:用品质对象

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 user-defined function raised exception

如果我用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和礼品已经QuerySets(尝试typeof(礼物)),所以你不能使用|它们之间。就好像你在用'嗨'|'再见'。你只使用|为Q objects

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

请注意,使用&和连接过滤器在Django(或应该是)中都是等效的,但是将礼物和gift1作为不同的QuerySet并评估它们的第一种方法是不同的:该方法导致两次访问)添加到数据库,同时在单个过滤器only hits it once中加入过滤器或Q对象。作为一个经验法则,你应该尽量减少对db的命中数。

希望这会有帮助

+0

嘿..很多很多..清除了很多东西 –