如何在Django Rest框架中的自定义字段中传递其他关键字参数?
我正在使用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)
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()
。