免责声明:此答案不完整
谁能解释一下 ListSerializer 和
字段序列化器?
我认为问题是serializers.ListSerializer 和 serializers.ListField 之间的区别
假设我们有两个models as
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
instrument = models.CharField(max_length=100)
def __str__(self):
return f'{self.first_name} {self.last_name}'
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
def __str__(self):
return f'{self.name} : {self.artist}'
和serializer as
class AlbumSerializer(serializers.ModelSerializer):
artist = serializers.StringRelatedField()
class Meta:
fields = '__all__'
model = Album
class MusicianSerializer(serializers.ModelSerializer):
AlbumSerializer(many=True, source='album_set')
class Meta:
fields = '__all__'
model = Musician
ListSerializer
如官方DRF doc中所述
当一个序列化器被实例化并且many=True被传递时,一个
将创建 ListSerializer 实例。然后是序列化程序类
成为父 ListSerializer 的 child
例如,我们可以将MusicianSerializer 改写为ListSerializer
class MusicianSerializer(serializers.ModelSerializer):
albums = serializers.ListSerializer(child=AlbumSerializer(), source='album_set')
class Meta:
fields = '__all__'
model = Musician
它会产生与以前相同的结果。但是,如果我们尝试使用 ListField 而不是 ListSerializer 它会引发错误
'RelatedManager' object is not iterable
查了源码发现ListSerializer和ListField都是继承自同一个类(父级和祖父级相同)