2011-02-01 6 views
0

Я знаю, как обычно делать динамические фильтры в Django, используя ** kwargs, однако, поскольку я относительно новичок в 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. Пожалуйста, обратите пристальное внимание на то, как я хочу динамично применять эти «кварты» для разных детей. –

+0

@Sunsu: Пожалуйста, обратите пристальное внимание на то, как работает Python. Есть, вероятно, десятки способов создания необходимого словаря. –

+0

Я понимаю, что я могу создать отдельный словарь для каждого варианта kwargs, который я хочу передать, однако это не отвечает на мой вопрос. –

Смежные вопросы