Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django Rest框架中的自定义字段中传递其他关键字参数?_Django_Django Rest Framework - Fatal编程技术网

如何在Django Rest框架中的自定义字段中传递其他关键字参数?

如何在Django Rest框架中的自定义字段中传递其他关键字参数?,django,django-rest-framework,Django,Django Rest Framework,我正在使用Django Rest框架,希望创建一个自定义字段以在序列化程序中使用 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)

我正在使用Django Rest框架,希望创建一个自定义字段以在序列化程序中使用

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()获得意外的关键字参数“key\u attr”


有没有办法在字段中注册为有效的KWARG?

通过子类化
字段创建的自定义字段不接受使用
**kwargs
方法中的
**kwargs
选项的额外参数。您应该重写
数据透视字段
中的
\uuuu init\uuu()方法
,并在实例上设置这些额外参数后弹出它们

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)
字段中
方法的
\uuuu init\uuuu()
DRF源代码:

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)

PivotField
是您的子类吗?为什么不覆盖它上面的
\u init\u
方法?请为
数据透视字段添加代码
@RahulGupta我已经添加了它,但我看不出它有什么帮助,因为错误在到达其表示形式之前很久就发生了。我能想到的唯一解决方案是在将kwargs传递给
super
之前从kwargs中提取值。我认为您应该在这里使用
kwargs.pop()
,而不是
kwargs.get()