免责声明: 这个答案是不完整
有人可以解释一下 ListSerializer 和 ListSerializer 之间的区别吗
字段序列化器?
我假设问题是之间的区别serializers.ListSerializer
and 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}'
and 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
列表序列化器
正如官方所说DRF doc http://www.django-rest-framework.org/api-guide/serializers/#listserializer
当序列化器被实例化并且many=True
通过了,一个
将创建 ListSerializer 实例。然后是序列化器类
成为一个child
父 ListSerializer 的
例如,我们可以重写MusicianSerializer
with ListSerializer
as
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
and ListField
从同一个类继承(父母和祖父母相同)