DRF ListSerializer 和 ListField

Mas*_*isa 2 django serialization django-rest-framework

我在我的项目中使用 django rest ,直到现在对于我使用ListSerializer 的对象列表,当我需要具有列表的最小长度和最大长度时,我用谷歌搜索并到达ListField

在此之前,我的代码运行良好,没有任何错误和不当行为。现在我使用 ListField 作为列表字段序列化器,但我不知道何时使用 ListSerializer?有人可以解释 ListSerializer 和 FieldSerializer 之间的区别吗?

我使用 ListSerializer 的示例代码:

tags = serializers.ListSerializer(child=serializers.CharField(allow_blank=False), required=False)
Run Code Online (Sandbox Code Playgroud)

我的 ListField 示例代码:

open_hour = serializers.ListField(child=serializers.DictField(), max_length=7, min_length=7)
Run Code Online (Sandbox Code Playgroud)

JPG*_*JPG 7

免责声明:这个答案并不完整

有人可以解释 ListSerializer 和 FieldSerializer 之间的区别吗?

我假设问题是之间的区别serializers.ListSerializerserializers.ListField假设

我们有两个models

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}'
Run Code Online (Sandbox Code Playgroud)

serializer作为

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
Run Code Online (Sandbox Code Playgroud)



ListSerializer如官方DRF 文档
中所述

当序列化器被实例化并many=True传递时,将创建一个ListSerializer实例。然后序列化器类成为child父 ListSerializer 的一个

例如,我们可以将其重写MusicianSerializerListSerializer

class MusicianSerializer(serializers.ModelSerializer):
    albums = serializers.ListSerializer(child=AlbumSerializer(), source='album_set')

    class Meta:
        fields = '__all__'
        model = Musician
Run Code Online (Sandbox Code Playgroud)

它会产生与以前相同的结果。但是,如果我们尝试使用ListField而不是ListSerializer它会引发错误

'RelatedManager' object is not iterable
Run Code Online (Sandbox Code Playgroud)


当我检查源代码时,我发现两者ListSerializer都是ListField从同一个类继承的(父级和祖级是相同的)