2013-06-04 55 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

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