加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Django动态filterset

发布时间:2020-12-20 13:10:05 所属栏目:Python 来源:网络整理
导读:所以我想从 django-filter module创建一个 django filters.FilterSet,但我想动态添加它的属性.例如,如果我想动态添加SubName: class UsersInfoFilter(filters.FilterSet): Name=NumberFilter(lookup_type='gte') def __new__(self): self.SubName=NumberFil
所以我想从 django-filter module创建一个 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']

问题是FilterSet是一个元类,它会在类被弄清楚后立即运行,因此在此之前没有任何地方可以动态添加项.

我已经尝试将函数作为参数放在filters.FilterSet类UsersInfo(AddObjects(filters.FilterSet))中,它返回了确切传递的内容,但我不能在那时引用UsersInfoFilter,因为它仍未完成创建.

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

python中的类似乎没有任何类型的构造函数.我假设我必须用元类来做一些魔法,但我已经尝试了我能想到的每一个组合,并且我最终处于智慧状态.

解决方法

您不能从__init__方法更改Meta子类…有两个选项可以解决您的问题…

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

class UsersInfoFilter(filters.FilterSet):
    class Meta:
        model = UsersInfo

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

其次,定义动态字段:

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']

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

附:为什么CamelCase的属性和领域?使用适当的pep-8.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读