如何处理 DRF 中序列化器中的保留字(from)

问题描述 投票:0回答:1

下面是一个在字段中使用保留字(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”来做到这一点

django-rest-framework
1个回答
5
投票

在我看来,它很丑陋,但可能有效,你可以重写

.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
键中。

© www.soinside.com 2019 - 2024. All rights reserved.