具有先决条件的动态Django过滤器

时间:2011-02-01 18:43:17

标签: python django

我知道如何使用** kwargs在Django中执行动态过滤器,但是因为我对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)

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

我为没有更清楚地陈述原始问题而道歉。我不确定这会不会更好:

我有许多不同的对象和对象子进程基于这些常见的参数场景进行过滤。出于这个原因,我不想为@ S.Lott慷慨地建议的每个kwargs变体单独定义字典。这与为每个过滤器输入参数一样重复。

我只想找出最有效的方法。在这种特殊情况下,似乎必须有一种更好的方法,而不是定义多个参数字典,每次都会重复('alpha', 'beta', 'gamma')声明。

1 个答案:

答案 0 :(得分: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)

由于您所能做的只是构建一个字典,因此您的问题似乎归结为构建适当的字典。