2011-09-25 68 views
1
if w: 
    conditions['is_discount_table'] = 'Q(is_discount_table = True)' 
    conditions['is_discount_banquet'] = 'Q(is_discount_banquet = True)' 

pl = Place.objects.filter(**conditions).order_by('name') 

SQL WHERE看起來像
Django的條件過濾器或

WHERE (
    "places_place"."is_discount_banquet" = true AND 
    "places_place"."is_discount_table" = true 
) 

如何修改w條件,即SQL WHERE看起來像
相當於

WHERE (

     "places_place"."is_discount_banquet" = true OR 
     "places_place"."is_discount_table" = true 

    ) 


Place.objects.filter(Q(is_discount_table = True) | Q(is_discount_banquet = True)) 
+0

我有一些問題了解你的問題。但從根本上講,Q是一個Django類,所以當你在條件字典(第一個代碼塊)中將它寫成字符串時,它沒有什麼意義。 – benjaoming

+0

問題是在創建正確的情況下。 – cetver

回答

3

我找到了答案:

conditions_unnamed = list() 
conditions_named = dict() 
if type: 
    conditions_named['types__id__in'] = list_unique(type.split('-')) 
if w: 
    conditions_unnamed.append(Q(is_discount_table = True) | Q(is_discount_banquet = True)) 
pl = Place.objects.filter(*conditions_unnamed, **conditions_named).order_by('name') 

如果有人知道一個更好的解決方案,請分享。

0

您似乎添加了一些額外的邏輯。我覺得這是你想表達什麼:

pl = Place.objects.all() 
if type: 
    pl = pl.filter(types__id__in=type.split('-')) 
if w: 
    pl = pl.filter(Q(is_discount_table = True) | Q(is_discount_banquet = True)) 
pl = pl.order_by('name') 
0
queres = {Q()} 
... 
if ... 
queres.update({Q(deprecation_date__lte=datetime.date.today())}) 
if ... 
queres.update({Q(deprecation_date=None)}) 
... 
devices = Device.objects.filter(*queres)