Динамический фильтр Django с необходимым условием - PullRequest
0 голосов
/ 01 февраля 2011

Я знаю, как обычно делать динамические фильтры в Django, используя ** kwargs, однако, поскольку я относительно новичок в python, я не могу понять, как сделать что-то немного отличающееся от некоторых других связанных вопросов, которые здесь задавались.

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

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)

================== РЕДАКТИРОВАТЬ===================

Я прошу прощения за то, что не сформулировал исходный вопрос более четко.Я не уверен, что это улучшит ситуацию:

У меня есть МНОГИЕ различные объекты и дочерние объекты для фильтрации на основе этих общих сценариев аргументов.По этой причине я не хочу индивидуально определять словарь для каждого варианта kwargs, как любезно предложил @ S.Lott.Это было бы так же, как вводить аргументы для каждого фильтра.

Я просто пытаюсь найти наиболее эффективный способ сделать это.Кажется, в этом конкретном случае должен быть лучший способ, чем определять словари с несколькими аргументами, которые каждый раз повторяли бы объявление ('alpha', 'beta', 'gamma').

1 Ответ

3 голосов
/ 01 февраля 2011

Аргументы функции являются словарем.

Создайте свой фильтр следующим образом.

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)

Поскольку все, что вы можете сделать - это создать словарь, похоже, ваша проблема сводится к созданию соответствующих словарей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...