boa*_*der 6 django-rest-framework
下面是一个在字段中使用保留字 ( 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)
Run Code Online (Sandbox Code Playgroud)
问题是当我读取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'
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但气味对我来说有点太多了,我想知道正确的方法。我可以概括这种方法,让我通过,output_name='from'
但这似乎仍然是错误的。我还希望能够采用一个具有键from
而不是键的字典_from
,但这是次要问题。我想我可以通过将 self.fields 更改为“from”而不是“_from”或在 FromIntegerField 类中将源设置为“from”来做到这一点
在我看来,它很丑陋,但可能有效,你可以覆盖该.get_fields(\xe2\x80\xa6)
方法
class EdgeSerializer(serializers.Serializer):\n _from = FromIntegerField(required=True)\n # …\n\n def get_fields(self):\n result = super().get_fields()\n _form = result.pop('_from', None)\n result['from'] = _from\n return result
Run Code Online (Sandbox Code Playgroud)\n因此,在这里我们将原始键值对映射到稍微不同的字典,并将其添加到键中from
。
归档时间: |
|
查看次数: |
520 次 |
最近记录: |