2011-12-14 19 views
15

Dinamik bazı Django filtre sorguları inşa ediyorum, using this example:Oluşturma Django filtre args ile sorguları dinamik ve kwargs

kwargs = { 'deleted_datetime__isnull': True } 
args = (Q(title__icontains = 'Foo') | Q(title__icontains = 'Bar')) 
entries = Entry.objects.filter(*args, **kwargs) 

Sadece args girdisini oluşturmak için nasıl emin değilim. Bu dizi olduğunu varsayalım:

strings = ['Foo', 'Bar'] 

nasıl oradan alırım:

for s in strings: 
    q_construct = Q(title__icontains = %s) % s 
    args.append(s) 

Ama nasıl bilmiyorum:

args = (Q(title__icontains = 'Foo') | Q(title__icontains = 'Bar') 

alabilirim en yakın olan | koşulunu ayarlayın.

cevap

12

Sen

argument_list = [] #keep this blank, just decalring it for later 
fields = ('title') #any fields in your model you'd like to search against 
query_string = 'Foo Bar' #search terms, you'll probably populate this from some source 

for query in query_string.split(' '): #breaks query_string into 'Foo' and 'Bar' 
    for field in fields: 
     argument_list.append(Q(**{field+'__icontains':query_object})) 

query = Entry.objects.filter(reduce(operator.or_, argument_list)) 

# --UPDATE-- here's an args example for completeness 

order = ['publish_date','title'] #create a list, possibly from GET or POST data 
ordered_query = query.order_by(*orders()) # Yay, you're ordered now! 

Bu fields her alanda sizin query_string her dizesi arayacaktır (düzgün terimini bilmiyorum) ve OR sonuç

doğrudan kwarg formatını kullanarak yineleme yapabilirsiniz

Keşke bunun için hala orijinal kaynağım olsa da, bu benim kullandığım koddan uyarlanmıştır. Q sınıfı nesnelerinin listesi var

+0

'reduce' Python 3'te' functools.reduce' şimdi https://docs.python.org/3.0/library/ olduğunu functools.html # functools.reduce – wasabigeek

12

, bir yan not olarak, üzerinde

args_list = [Q1,Q2,Q3] # Q1 = Q(title__icontains='Foo') or Q1 = Q(**{'title':'value'}) 
args = Q() #defining args as empty Q class object to handle empty args_list 
for each_args in args_list : 
    args = args | each_args 

query_set= query_set.filter(*(args,)) # will excute, query_set.filter(Q1 | Q2 | Q3) 
# comma , in last after args is mandatory to pass as args here