2012-01-17 59 views
9

Django sorgu ifadelerinin bir listesini almanın bir yolu var mı (ör. Q, Qdjango.db.models.Q) ve bitwise VEYA birlikte mi? Başka bir deyişleBit işlemleri için Python listesi

, ben böyle bir şey var:

search_string = "various search terms" 

Ve bunu yapmak istiyorum: search_params şimdi Q(description__icontains="various") | Q(description__icontains="search" | Q(description__icontains="terms"

eşdeğerdir

search_params = [Q(description__icontains=term) for term in re.split(r'\W', search_string)] 
search_params = something_magical(search_params) 
results = Record.objects.filter(search_params) 

Ben öyle olacağına biliyorum böyle bir işlevle mümkün olabilir:

def something_magical(lst): 
    result = lst[0] 
    for l in lst[1:] 
     result |= l 
    return result 

Bu işlevin Python'da zaten yerleşik olup olmadığını merak ediyorum (ve bunun benim işlevimden daha iyi olduğunu varsayıyorum).

Bu uygulama için onunla ilgilenmeme rağmen, sadece teorik olarak ilgileniyorum.

+0

Böyle bir django operatörü olduğunu sanmıyorum ... Ama tüm "veya" sorgularını yapabilir ve daha sonra sonuçları birleştirmek için python seti operatörlerini kullanabilirsin? (http://docs.python.org/library/sets.html#set-objects) –

+0

@RichardGreen oldukça çirkin sorular yaratabilir –

cevap

19

Muhtemelen yerleştirecektir

import operator 
from functools import reduce # Python 3 
search_params = reduce(operator.or_, search_params, Q()) 

Bu

istediğiniz bir bit temelinde veya boş durumda Q() ile başlayan search_params tüm öğeler arasında ( |).

+0

Güzel! Bu gibi şeyler benim aşk pythonumu daha da arttırıyor. –

+0

Sadece “küçült” ve “harita” ile oynayarak biraz zaman harcadım. –

+0

Harika sevdiniz! Muhtemelen [itertools] 'un (http://docs.python.org/library/itertools.html) tadını çıkarabilirsiniz. –