Django DRF ListSerializer和ListField

Django DRF ListSerializer和ListField,django,django-rest-framework,serialization,Django,Django Rest Framework,Serialization,我在我的项目中使用django rest,到目前为止,我使用的对象列表都是使用django rest的,因为我需要在Google上搜索到列表的最小长度和最大长度 在此之前,我的代码没有任何错误和不当行为。现在我使用ListField作为列表字段序列化程序,但我不知道何时使用ListSerializer?有人能解释ListSerializer和FieldSerializer之间的区别吗 我的ListSerializer示例代码: tags = serializers.ListSerializer(

我在我的项目中使用django rest,到目前为止,我使用的对象列表都是使用django rest的,因为我需要在Google上搜索到列表的最小长度和最大长度

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

我的ListSerializer示例代码:

tags = serializers.ListSerializer(child=serializers.CharField(allow_blank=False), required=False)
我的ListField示例代码:

open_hour = serializers.ListField(child=serializers.DictField(), max_length=7, min_length=7)

免责声明:此答案不完整

有人能解释ListSerializer和 字段序列化程序

我假设问题是
序列化程序.ListSerializer
序列化程序.ListField

假设我们有两个
模型
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}'
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
class MusicianSerializer(serializers.ModelSerializer):
    albums = serializers.ListSerializer(child=AlbumSerializer(), source='album_set')

    class Meta:
        fields = '__all__'
        model = Musician
serializer
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}'
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
class MusicianSerializer(serializers.ModelSerializer):
    albums = serializers.ListSerializer(child=AlbumSerializer(), source='album_set')

    class Meta:
        fields = '__all__'
        model = Musician


列表序列化程序
如官方声明所述

当序列化程序被实例化并传递
many=True
时 将创建ListSerializer实例。然后是序列化程序类 成为父ListSerializer的子项

例如,我们可以使用
ListSerializer
MusicianSerializer
重新编写为

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}'
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
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
都是从同一个类继承的(父级和父级是相同的)

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

有人能解释ListSerializer和 字段序列化程序

我假设问题是
序列化程序.ListSerializer
序列化程序.ListField

假设我们有两个
模型
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}'
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
class MusicianSerializer(serializers.ModelSerializer):
    albums = serializers.ListSerializer(child=AlbumSerializer(), source='album_set')

    class Meta:
        fields = '__all__'
        model = Musician
serializer
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}'
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
class MusicianSerializer(serializers.ModelSerializer):
    albums = serializers.ListSerializer(child=AlbumSerializer(), source='album_set')

    class Meta:
        fields = '__all__'
        model = Musician


列表序列化程序
如官方声明所述

当序列化程序被实例化并传递
many=True
时 将创建ListSerializer实例。然后是序列化程序类 成为父ListSerializer的子项

例如,我们可以使用
ListSerializer
MusicianSerializer
重新编写为

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}'
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
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
都是从同一个类继承的(父级和父级是相同的)

如果我需要一个字段,它是字符串或Dict等类型的列表,那么使用哪一个更好?为什么?我同时使用了这两种代码,代码运行良好!我有点困惑。不幸的是,我也有点困惑:(希望有人能更好地回答这个问题,如果我需要一个字段,它是某种类型的列表,比如字符串或Dict,哪一个更好地使用?为什么?我同时使用了这两种类型,代码工作正常!我有点困惑。不幸的是,我也有点困惑:(希望有人能以更好的方式回答