我希望序列化一个有很多选择的模型:
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'}
非常感谢帮助。 非常感谢。
答案 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_representation
和to_internal_value
,而不是to/from_native
。