2011-12-14 18 views
15

मैं कुछ Django फिल्टर प्रश्नों गतिशील निर्माण कर रहा हूँ, using this example:निर्माण Django फिल्टर प्रश्नों गतिशील और kwargs

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

मैं सिर्फ यकीन है कि कैसे args के लिए प्रवेश के निर्माण के लिए नहीं कर रहा हूँ। मैं इस सरणी है कहते हैं:

strings = ['Foo', 'Bar'] 

मैं कैसे करने के लिए वहाँ से मिलता है:

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

निकटतम मैं मिल सकता है:

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

लेकिन मैं कैसे करने के लिए पता नहीं है | स्थिति सेट अप करें।

उत्तर

12

आप सीधे एक kwarg प्रारूप का उपयोग कर यह पुनरावृति कर सकते हैं (मैं उचित शब्द पता नहीं)

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! 

यह fields में प्रत्येक क्षेत्र में अपनी query_string में प्रत्येक स्ट्रिंग के लिए दिखेगा और या परिणाम

मेरी इच्छा है कि मेरे पास अभी भी मेरा मूल स्रोत था, लेकिन यह मेरे द्वारा उपयोग किए जाने वाले कोड से अनुकूलित किया गया है।

+0

'reduce' अब अजगर 3 में' functools.reduce' है https://docs.python.org/3.0/library/ functools.html # functools.reduce – wasabigeek

12

आप क्यू वर्ग वस्तुओं की सूची है,

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 
एक तरफ ध्यान दें, पर
संबंधित मुद्दे