【问题标题】:Dynamic Django Filter with Prerequisite具有先决条件的动态 Django 过滤器
【发布时间】:2011-02-01 18:43:17
【问题描述】:

我知道通常如何使用 **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)

===================编辑===================

对于没有更清楚地说明原始问题,我深表歉意。不过,我不确定这是否会让它变得更好:

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

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

【问题讨论】:

    标签: python django


    【解决方案1】:

    函数的参数字典。

    像这样构建你的过滤器。

    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)
    

    由于您所能做的就是构建字典,看来您的问题归结为构建适当的字典。

    【讨论】:

    • 抱歉,您误解了我的意图。我知道如何做一个典型的 **kwargs 过滤器。请密切注意我想如何将这些“kwargs”动态地应用于不同的孩子。
    • @Sunsu:请密切关注 Python 的工作方式。可能有几十种方法可以构建所需的字典。
    • 我知道我可以为我想要传递的每个 kwargs 变体构建一个单独的字典,但这并不能回答我的问题。
    • @Sunsun:那么您应该考虑澄清和纠正您的问题,以便清楚您做什么想要的与此不同。
    • 当我回到我的比赛时,我会试一试。此刻在我的手机上。感谢您愿意提供帮助。
    猜你喜欢
    • 2016-08-18
    • 2015-11-29
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多