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)
非常感谢帮助.非常感谢.
您可以使用模型字段的详细值获取只读序列化器字段,并通过该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)
使用原始值在序列化器字段中设置选项,如下所示......
ACCESSIBILITY_CHOICES = (
('Full', 'Full'),
('Partial', 'Partial'),
('None', 'None')
)
Run Code Online (Sandbox Code Playgroud)
然后看看重写“to_native”方法,以便将字符串值转换为其等效的整数。
这应该为您提供一个使用字符串表示形式的外部 API,以及一个使用整数表示形式的后端。
2019 年更新: DRF 现在使用不同的方法名称来进行内部转换,请参阅文档。命名它们:to_representation和to_internal_value,而不是to/from_native。
| 归档时间: |
|
| 查看次数: |
2951 次 |
| 最近记录: |