【发布时间】:2020-01-29 08:41:26
【问题描述】:
我正在尝试实现与 Djang Rest Framework 教程Custom relational fields 非常相似的东西。
为了提醒,提供的代码sn-p是:
import time
class TrackListingField(serializers.RelatedField):
def to_representation(self, value):
duration = time.strftime('%M:%S', time.gmtime(value.duration))
return 'Track %d: %s (%s)' % (value.order, value.name, duration)
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackListingField(many=True)
class Meta:
model = Album
fields = ['album_name', 'artist', 'tracks']
然后“此自定义字段将序列化为以下表示”(在教程中引用):
{
'album_name': 'Sometimes I Wish We Were an Eagle',
'artist': 'Bill Callahan',
'tracks': [
'Track 1: Jim Cain (04:39)',
'Track 2: Eid Ma Clack Shaw (04:19)',
'Track 3: The Wind and the Dove (04:34)',
...
]
}
我了解这一点,并已针对我的特殊情况实施了它。
我不明白的是实现to_internal_value(self, data) 的方式,因为我想提供一个读写API。
我知道to_internal_value(self, data) 应该返回一个 AlbumTrack 对象,但我不明白如何构建它。特别是如何取回相册相关的id?
如果我们发布上面的 JSON 结构,to_internal_value(self, data) 将在每个轨道上调用一次,'Track 1: Jim Cain (04:39)'... 对于 data 值。 我不明白我们如何根据这些 data 值更新轨道模型。
【问题讨论】:
标签: django django-rest-framework deserialization