【发布时间】:2019-11-14 00:59:31
【问题描述】:
上下文
所以我有一个带有嵌套TrackSerializer 的AlbumSerializer。为了在前端方便,我覆盖了AlbumSerializer 的表示,以制作曲目字典而不是列表。
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ('id', 'order', 'title')
# directly upsert tracks
def create(self, validated_data):
obj, created = Track.objects.update_or_create(
album_id= validated_data['album_id'],
order=validated_data['order'],
defaults={'title': validated_data['title']}
)
return obj
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True)
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
# make a dictionary of the tracks
def to_representation(self, instance):
representation = super().to_representation(instance)
representation['tracks'] = {track['id']: track for track in representation['tracks']}
return representation
#update tracks with the album endpoint
def update(self, instance, validated_data):
for track in validated_data['tracks']
obj, created = Track.objects.update_or_create(
album_id= track['album_id'],
order=track['order'],
defaults={'title': track['title']}
)
return instance
问题
现在,当我尝试更新专辑(包括一些曲目标题)时,我会收到Expected a list of items but got type \"dict\"。这是有道理的。
问题
如何让 DRF 接受字典而不是曲目列表?
更新:刚刚了解了drf-rw-serializers。似乎正是我需要的。
【问题讨论】:
-
你为什么在
forloop里面使用return obj? -
谢谢!做了一些复制粘贴。编辑了帖子。对此感到抱歉。
标签: django django-rest-framework django-serializer