如何在 Django Rest Framework 的自定义字段中传递额外的关键字参数?

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?

Rah*_*pta 5

由子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)