**之后的Django create()参数必须是映射,而不是列表



我正在使用DRF创建一个可写的嵌套序列化程序,我一直在遵循官方文档(https://www.django-rest-framework.org/api-guide/relations/#writable-嵌套序列化器(。

我的用例与文档中给出的用例非常相似。

型号.py

class Album(models.Model):
album_name = models.CharField(max_length=100)
artist = models.CharField(max_length=100)
class Track(models.Model):
album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
order = models.IntegerField()
title = models.CharField(max_length=100)
duration = models.IntegerField()
class Meta:
unique_together = ['album', 'order']
ordering = ['order']
def __str__(self):
return '%d: %s' % (self.order, self.title)

序列化程序.py

class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ['order', 'title', 'duration']
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True)
class Meta:
model = Album
fields = ['album_name', 'artist', 'tracks']
def create(self, validated_data):
tracks_data = validated_data.pop('tracks')
album = Album.objects.create(**validated_data)
for track_data in tracks_data:
Track.objects.create(album=album, **track_data)
return album

我将数据(我正在进行一些后期处理并创建这些数据(传递到序列化程序的视图如下所示

注意:我正在视图中创建此数据数据根据我的理解是一个字典,"tracks"有一个字典列表

视图.py

@api_view(['POST'])
def my_view():
....
my_data = 
{
'album_name': 'The Grey Album',
'artist': 'Danger Mouse',
'tracks': [
{'order': 1, 'title': 'Public Service Announcement', 'duration': 245},
{'order': 2, 'title': 'What More Can I Say', 'duration': 264},
{'order': 3, 'title': 'Encore', 'duration': 159},
]
}
serializer = AlbumSerializer(data= my_data)
serializer.is_valid()
....

现在,每次调用my_viewPOST API时,我都会得到以下错误

**之后的

create((参数必须是映射,而不是列表

我的主要怀疑是My_data的格式我认为,根据My_data内部的错误,"tracks"可能应该有一个值列表作为映射对象?

我试图遵循堆栈溢出社区中建议的一些答案

  1. 序列化多个模型并在一个json响应中发送所有django-rest框架
  2. **之后的create((参数必须是映射,而不是列表,Django REST框架(实现我自己的create方法错误(

我到处找过,想知道发生了什么,但我找不到,任何线索都会很有帮助,提前谢谢!

更新

所以我试图通过使用来验证数据是否有效

python管理器外壳

序列化程序.is_valid((返回True,但我在保存searalizer 时出错

TypeError:**之后的create((参数必须是映射,而不是列出

我通过在models.py 中添加@property解决了这个问题

型号.py

class Album(models.Model):
album_name = models.CharField(max_length=100)
artist = models.CharField(max_length=100)
@property
def track_details(self):
return self.track.all()
class Track(models.Model):
album = models.ForeignKey('Album', related_name='tracks', on_delete=models.CASCADE)
order = models.IntegerField()
title = models.CharField(max_length=100)
duration = models.IntegerField()
class Meta:
unique_together = ['album', 'order']
ordering = ['order']
def __str__(self):
return '%d: %s' % (self.order, self.title)

serializers.py

class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ['order', 'title', 'duration']
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True)
class Meta:
model = Album
fields = ['album_name', 'artist', 'tracks']
def create(self, validated_data):
tracks_data = validated_data.pop('tracks')
album = Album.objects.create(**validated_data)
for track_data in tracks_data:
Track.objects.create(**track_data, album=album)
return album

最新更新