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

标签 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

我希望能够像这样向字段传递额外的参数。
resources = PivotField(key_attr='type.name', value_attr='uri')

但是,我不断收到以下错误。

TypeError: init() got an unexpected keyword argument 'key_attr'



有什么方法可以将这些注册为该领域内的有效 kwargs?

最佳答案

通过子类化创建的自定义字段 Field类不接受使用 **kwargs 的额外参数__init__() 中的选项方法。您应该覆盖 __init__() PivotField 中的方法并在实例上设置它们后弹出这些额外的参数。

__init__()的DRF源代码Field 中的方法类(class):

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):
       ...

从上面我们可以看到,除了定义的关键字参数之外,没有发送额外参数的选项。

所以,你应该从 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)

关于django - 如何在 Django Rest Framework 的自定义字段中传递额外的关键字参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37326206/

相关文章:

mysql - Django:汇集 MySQL 数据库连接

python - 如何在 Django 中使用反向获取完整 url

python - Django Rest Framework 中的嵌套序列化程序 "Through model"

Django + django-rest-framework-simplejwt 保护 View

django - 数据库不存在 postgresql

python - 我可以在带有 Python3.x 的 Django(dev 1.6.x) 上使用 MySQL 吗?

python - 如何解决错误 "object_permission() takes 3 positional arguments but 4 were given"?

django - 使用 django 和 drf-yasg 重用序列化程序的问题

django - 如何在一个页面中管理多个modelformset_factory?

python - 未提供身份验证凭据。部署到 AWS 时