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中的类似乎没有任何类型的构造函数。我假设我必须用元类做某种魔法,但我已经尝试了我能想到的每一种组合,并且不知所措。
您无法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。
| 归档时间: |
|
| 查看次数: |
1160 次 |
| 最近记录: |