Django 动态过滤器集

Dak*_*san 5 python django metaclass multiple-inheritance django-filter

所以我想从django-filter 模块创建一个django filters.FilterSet,但我想动态添加它的属性。例如,如果我想动态添加:SubName

class UsersInfoFilter(filters.FilterSet):
    Name=NumberFilter(lookup_type='gte')
    def __new__(self):
        self.SubName=NumberFilter(lookup_type='gte')
        self.Meta.fields.append('SubName')
    class Meta:
        model = UsersInfo
        fields = ['UserID', 'LanguageID', 'Name']
Run Code Online (Sandbox Code Playgroud)

问题是 FilterSet 是一个元类,一旦确定了类就会立即运行,因此在此之前没有任何地方可以动态添加项目。

我试过将一个函数作为参数放入 filters.FilterSet 中class UsersInfo(AddObjects(filters.FilterSet)),它返回准确传递的内容,但当时我无法引用UsersInfoFilter,因为它仍未完成创建。

我也尝试创建UsersInfoFilter自己的基类,然后创建一个class RealUsersInfoFilter(UsersInfoFilter, filters.FilterSet)作为我的实际过滤器,但是 FilterSet 只是抛出关于缺少名为字段的属性的警告。

python中的类似乎没有任何类型的构造函数。我假设我必须用元类做某种魔法,但我已经尝试了我能想到的每一种组合,并且不知所措。

Jer*_*zyk 0

您无法Meta__init__方法更改子类...有 2 个选项可以解决您的问题...

第一个 - 在所有模型字段上定义“宽”过滤器:

class UsersInfoFilter(filters.FilterSet):
    class Meta:
        model = UsersInfo
Run Code Online (Sandbox Code Playgroud)

它将为您的所有模型字段创建默认过滤器。

其次,定义动态字段:

class UsersInfoFilter(filters.FilterSet):
    name = NumberFilter(lookup_type='gte')

    def __init__(self):
        super(UsersInfoFilter, self).__init__()

        base_filters['subname'] = NumberFilter(name='subname', lookup_type='gte')

    class Meta:
        model = UsersInfo
        fields = ['user_id', 'language_id', 'name']
Run Code Online (Sandbox Code Playgroud)

(我不知道这是否是您真正想要的 - 因为尽管“动态”添加字段 - 它应该声明为静态 - 这里没有逻辑)

ps 为什么属性和字段采用驼峰命名法?使用适当的 pep-8。