2016-08-04 5 views
0

私はDjangoの研究機能を(Pythonで)最適化する方法を探します。私はこれを持っているこの時:ループ内のargsを持つDjango objects.filter

def search(acronym=None, name=None, reference=None): 
    queryset = Organization.objects 

    if acronym: 
     queryset = queryset.filter(acronym=acronym) 

    if name: 
     queryset = queryset.filter(name=name) 

    if reference: 
     queryset = queryset.filter(reference=reference) 

    return queryset 

問題がある、私は引数を追加するたびに、私は、ループ内でこれを置くための方法がありますなど 、+フィルタあれば追加する必要がありますか?例えば

:そのような

def search(acronym=None, name=None, reference=None): 
    queryset = Organization.objects 
    for arg in args : 
     if arg : 
      queryset = queryset.filter(arg = arg) 
    return queryset 

か何か?

あなたの関数定義の事前のおかげで

+0

は 'defのでしょう検索(** kwargs) '...' queryset.filter(** kwargs) '仕事?..(私はそれをテストするためにatm時間はありません) – Sayse

答えて

0

使用**kwargsと渡す前辞書の理解を使用してNone価値のアイテムをフィルタリングし、filter名前付き引数を開梱:

def search(**kwargs): 
    kwargs = {k: v for k, v in kwargs.items() if v} 
    queryset = Organization.objects.filter(**kwargs) 
    return queryset 
+0

それは完全に動作します。ありがとうございました :) – Meojifo

関連する問題