上下文
所以我有一个AlbumSerializer和一个嵌套的TrackSerializer。为了在前面方便起见,我重写了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。似乎正是我所需要的。
发布于 2019-07-03 11:34:56
在update功能中,您是:
以下是一个错误的固定代码::
def update(self, instance, validated_data):
for trackid, track in validated_data['tracks'].items():
obj = Track.objects.filter(id = trackid)
if obj:
obj[0].album_id = track['album_id']
obj[0].order = track['order']
obj[0].title = title= track['title']
obj[0].save()
else:
Track.objects.create(
album_id= track['album_id'],
order=track['order'],
title= track['title'])
return instancehttps://stackoverflow.com/questions/56868385
复制相似问题