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

时间:2013-11-20 21:32:56

标签: 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)

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

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

class HouseSerializer(serializers.ModelSerializer):

    class Meta:
        model = House
如果我只想要整数值

效果很好

{accessibility:1}

但是,我想得到什么

{accessibility:'Full'}

非常感谢帮助。 非常感谢。

2 个答案:

答案 0 :(得分: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', )

答案 1 :(得分:2)

使用原始值设置序列化程序字段中的选项,如此...

ACCESSIBILITY_CHOICES = (
    ('Full', 'Full'),
    ('Partial', 'Partial'),
    ('None', 'None')
)

然后看看覆盖'to_native'方法,以便将字符串值转换为它们的等价整数。

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

更新2019: DRF现在使用不同的方法名称从/转换为内部,请参阅docs。为他们命名:to_representationto_internal_value,而不是to/from_native