下面是一个在字段中使用保留字(from)的序列化器:
class EdgeSerializer(serializers.Serializer):
field_name_map = {
'_from': 'from'
}
class Meta:
read_only_fields = ('_from', 'to', 'weight')
_from = serializers.IntegerField(required=True)
to = serializers.IntegerField(required=True)
weight = serializers.FloatField(required=True)
问题是当我读到
serializer.data
时,“输出”中的字段名称是_from
,而不是from
。我尝试过使用 source=
,我尝试过反转 field_name_map
(键,值)=>(值,键)。
我无法使用
from
作为字段名称,python 尝试解析文件时会崩溃
所以,我这样做是有效的,但在我嘴里留下了不好的味道,似乎是“错误”的做法:
class FromIntegerField(serializers.IntegerField):
def bind(self, field_name, parent):
super().bind(field_name, parent)
self.field_name = 'from'
class EdgeSerializer(serializers.Serializer):
_from = FromIntegerField(required=True)
to = serializers.IntegerField(required=True)
weight = serializers.FloatField(required=True)
class Meta:
read_only_fields = ('_from', 'to', 'weight')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
#self.fields (a `BindingDict`) contains a field keyed by '_from'
# to the field where I changed the field_name to 'from'
虽然这有效,但气味对我来说有点太多了,我想知道正确的方法。我可以概括这种方法,让我通过
output_name='from'
但这似乎仍然是错误的。我还希望能够采用一个键为 from
而不是 _from
的字典,但这是次要问题。我想我可以通过将 self.fields 更改为“from”而不是“_from”或在 FromIntegerField 类中将源设置为“from”来做到这一点
在我看来,它很丑陋,但可能有效,你可以重写
.get_fields(…)
方法
class EdgeSerializer(serializers.Serializer):
_from = FromIntegerField(required=True)
# other fields
def get_fields(self):
result = super().get_fields()
_from = result.pop('_from', None)
result['from'] = _from
return result
因此,我们将原始键值对映射到稍微不同的字典,并将其添加到
from
键中。