python – Django动态filterset
所以我想从
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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |