序列化IntegerField的选择文本和选择

Dan*_*ien 9 django-rest-framework

我想序列化一个有很多选择的模型:

class House(models.Model):
ACCESSIBILITY_CHOICES = (
    (ACCESSIBILITY_FULL, 'Full'),
    (ACCESSIBILITY_PARTIAL, 'Partial'),
    (ACCESSIBILITY_NONE, 'None')
)

accessibility = models.IntegerField(max_length=1, choices=ACCESSIBILITY_CHOICES, null=True)
Run Code Online (Sandbox Code Playgroud)

我喜欢默认的序列化程序,例如:

class HouseView(generics.ListCreateAPIView):
    model = House
    serializer_class = HouseSerializer

class HouseSerializer(serializers.ModelSerializer):

    class Meta:
        model = House
Run Code Online (Sandbox Code Playgroud)

如果我只想要整数值,那么效果很好

{accessibility:1}
Run Code Online (Sandbox Code Playgroud)

但是,我想得到什么

{accessibility:'Full'}
Run Code Online (Sandbox Code Playgroud)

非常感谢帮助.非常感谢.

yel*_*cap 7

您可以使用模型字段的详细值获取只读序列化器字段,并通过该get_FOO_display方法进行选择.在字段上设置选项时会自动添加此方法.您可以将该方法设置为字符字段的来源.

对于也支持写入数据的端点,我建议添加"普通"字段和另一个带_name扩展名的只读字段.

在您的示例中,以下内容应生成您要查找的输出.它accessibility_name是只读的,而accessibility允许写入/更新值.

class HouseSerializer(serializers.ModelSerializer):

    accessibility_name = serializers.CharField(source='get_accessibility_display')

    class Meta:
        model = House
        fields = ('accessibility', 'accessibility_name', )
Run Code Online (Sandbox Code Playgroud)


Tom*_*tie 3

使用原始值在序列化器字段中设置选项,如下所示......

ACCESSIBILITY_CHOICES = (
    ('Full', 'Full'),
    ('Partial', 'Partial'),
    ('None', 'None')
)
Run Code Online (Sandbox Code Playgroud)

然后看看重写“to_native”方法,以便将字符串值转换为其等效的整数。

这应该为您提供一个使用字符串表示形式的外部 API,以及一个使用整数表示形式的后端。

2019 年更新: DRF 现在使用不同的方法名称来进行内部转换,请参阅文档。命名它们:to_representationto_internal_value,而不是to/from_native