2011-02-01 18 views
0

私は、** kwargsを使用してDjangoで動的フィルタを実行する方法を知っていますが、私は比較的新しいPythonであるため、他の関連する質問ここで尋ねられている。動的Djangoフィルタ(前提条件付き)

異なるモデルの子供に同じフィルタを動的に適用したいと思います。私は、これは正しくありません実現が、それはあなたに私がやりたいことの要点を与える必要があります:

self.type = object.__class__.__name__ 
if self.type = 'Running':  
    kwargs = '%s__%s__%s' % ('alpha', 'beta', 'gamma') 
elif self.type = 'Jumping': 
    kwargs = '%s__%s' % ('alpha', 'beta') 
elif self.type = 'Playing': 
    kwargs = '%s' % ('alpha',) 

self.customers = Fest.objects.filter(foo__kwargs = object) 
self.customers = Fest.objects.filter(bar__kwargs = object) 
self.customers = Jest.objects.filter(baz__kwargs = object) 

=================== EDIT == =================

私は元の質問をより明確に述べていないことをお詫び申し上げます。私はこれがそれをより良くするかどうか分からない:

私は、これらの一般的な引数のシナリオに基づいてフィルタリングするオブジェクトとオブジェクトの子どもがたくさんあります。そのため、kwargsの各変種に対して辞書を個別に定義したくない@S.Lottは優雅に提案しています。各フィルターの引数を入力するのと同じくらい繰り返します。

私はこれを行う最も効率的な方法を理解しようとしています。毎回('alpha', 'beta', 'gamma')宣言を繰り返す複数の引数辞書を定義するよりも、この特定のケースではより良い方法が必要であるようです。

答えて

3

関数の引数は、の辞書です。

このようなフィルタを構築してください。

def filter_with_prefix(self, prefix, object): 

    if self.type = 'Running':  
     kwargs = { '%s__%s__%s__%s' % (prefix, 'alpha', 'beta', 'gamma') : object } 
    elif self.type = 'Jumping': 
     kwargs = { '%s__%s__%s' % (prefix, 'alpha', 'beta') : object } 
    elif self.type = 'Playing': 
     kwargs = { '%s__%s' % (prefix, 'alpha',) : object } 
    return kwargs 

この

f1= some_object.filter_with_prefix('foo', object) 
self.customers = Fest.objects.filter(**f1) 
f2= some_object.filter_with_prefix('bar', object) 
self.customers = Fest.objects.filter(**f2) 
f3= some_object.filter_with_prefix('baz', object) 
self.customers = Fest.objects.filter(**f3) 

のようにそれを使用してくださいあなたが行うことができ、すべてが辞書を構築しているので、あなたの問題は、適切な辞書を構築することに帰着することが表示されます。

+0

申し訳ありませんが、私は何をしようとしているのか誤解しています。私は典型的な** kwargsフィルターを行う方法を知っています。これらの「kwargs」をさまざまな子供たちに動的に適用する方法に細心の注意を払ってください。 –

+0

@ Suunsu:Pythonの仕組みに細心の注意を払ってください。必要な辞書を構築するには、おそらく数十もの方法があります。 –

+0

私は、私が渡したいkwargのそれぞれの変形に対して個々の辞書を構築することができますが、それは私の質問には答えません。 –

関連する問題