2011-12-14 32 views
15

Tôi đang xây dựng một số truy vấn Django lọc tự động, using this example:Xây dựng Django truy vấn lọc tự động với args và kwargs

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

Tôi chỉ không chắc chắn làm thế nào để xây dựng các mục nhập cho args. Nói rằng tôi có mảng này:

strings = ['Foo', 'Bar'] 

Làm thế nào để tôi nhận được từ đó đến:

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

Gần nhất tôi có thể nhận được là:

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

Nhưng tôi không biết làm thế nào để thiết lập điều kiện |.

Trả lời

12

Bạn có thể lặp lại nó trực tiếp sử dụng một định dạng kwarg (Tôi không biết thuật ngữ thích hợp)

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! 

này sẽ xem xét đối với từng chuỗi trong query_string của bạn trong từng lĩnh vực trong fields và OR kết quả

Tôi ước tôi vẫn có nguồn gốc của mình cho việc này, nhưng điều này được điều chỉnh từ mã tôi sử dụng.

+0

trên một lưu ý phụ, 'reduce' tại là 'functools.reduce' bằng Python 3 https://docs.python.org/3.0/library/ functools.html # functools.reduce – wasabigeek

12

bạn có danh sách của các đối tượng lớp Q,

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 
Các vấn đề liên quan