2016-08-04 19 views
1

私はdjangoの新機能で、if文のほかに条件付きでフィルタをかけるより効率的な方法があるのだろうかと思っていました。ローカル変数に基づくDjango条件付きフィルタ

は考える:

test_names = ["all"] 
test_types = ["a", "b", "c"] 
... (more lists) 

を私はこれを行うことができます知っている:

q = tests.objects.all() 

if test_names[0] == "all": 
    q = q.all() 
else: 
    q = q.filter("name__in=test_names") 

if test_types[0] == "all": 
    q = q.all() 
else: 
    q = q.filter("type__in=test_type") 

etc... 

私はこのような何か希望:私は私ので、if文を避けたい

q = test.objects \ 
     .filter((if test_names[0]=="all") "name__in=test_names") \ 
     .filter((if test_types[0]=="all") "type__in=test_types") \ 
     ...etc 

を"test_names"のような異なるリストに基づいて同じクエリデータに対してこれを何回も実行しなければなりません。

答えて

0

あなたのリストには条件がありますので、異なる条件のためにはifが必要です。あなたは、1つのクエリ文で逃げることができるかもしれませんが、あなたはあなたのリスト上で動作する必要があります。

test_name_filter = {} if test_names[0] == 'all' else {'name__in': test_names} 
test_type_filter = {} if test_type[0] == 'all' else {'type__in': test_types} 
# ...... 
q = test.objects.filter(**test_name_filter).filter(**test_type_filter) 

ので、これは動作するはずです:DjangoのORMフィルタは辞書としてフィルタ条件を受け入れることができ

  1. 、キーを基準として使用し、値をフィルタ値として使用します。

  2. 空のdictは何もフィルタリングしないのと同じ意味で、すべてを返します。

関連する問題