Sov*_*iut 5 django django-rest-framework
我正在使用 Django Rest Framework 并希望创建一个自定义字段以在我的序列化程序中使用。
class PivotField(serializers.Field):
def __init__(self, *args, **kwargs):
self.key_attr = kwargs.get('key_attr')
self.value_attr = kwargs.get('value_attr')
super(PivotField, self).__init__(*args, **kwargs)
def to_representation(self, value):
data = {}
for model in value.all():
# this is where I'd use the key_attr and value_attr
data[model.type.name] = model.uri
return data
Run Code Online (Sandbox Code Playgroud)
我希望能够像这样向字段传递额外的参数。
resources = PivotField(key_attr='type.name', value_attr='uri')
Run Code Online (Sandbox Code Playgroud)
但是,我不断收到以下错误。
TypeError: init () 得到了一个意外的关键字参数 'key_attr'
有什么方法可以将这些注册为该领域内的有效 kwargs?
由子Field类创建的自定义字段不接受**kwargs在__init__()方法中使用选项的额外参数。您应该覆盖该__init__()方法PivotField并在实例上设置它们后弹出这些额外的参数。
类中__init__()方法的DRF源代码Field:
class Field(object):
def __init__(self, read_only=False, write_only=False,
required=None, default=empty, initial=empty, source=None,
label=None, help_text=None, style=None,
error_messages=None, validators=None, allow_null=False):
...
Run Code Online (Sandbox Code Playgroud)
从上面我们可以看到,除了定义的关键字参数之外,没有发送额外参数的选项。
因此,您应该kwargs在设置实例时弹出这些额外的参数。
class PivotField(serializers.Field):
def __init__(self, *args, **kwargs):
self.key_attr = kwargs.pop('key_attr', None) # pop the custom kwarg
self.value_attr = kwargs.pop('value_attr', None) # pop the custom kwarg
super(PivotField, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2174 次 |
| 最近记录: |