【问题标题】:DRF ListSerializer and ListFieldDRF ListSerializer 和 ListField
【发布时间】:2022-01-26 20:45:28
【问题描述】:

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

在此之前,我的代码运行良好,没有任何错误和不当行为。现在我使用 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)

【问题讨论】:

    标签: django django-rest-framework serialization


    【解决方案1】:

    免责声明:此答案不完整

    谁能解释一下 ListSerializer 和 字段序列化器?

    我认为问题是serializers.ListSerializerserializers.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
    


    查了源码发现ListSerializerListField都是继承自同一个类(父级和祖父级相同)

    【讨论】:

    • 如果我需要一个字段,它是某种类型的列表,例如 String 或 Dict,哪个更好用?为什么?我都使用了,代码工作正常!我有点困惑。
    • 不幸的是,我也有点困惑:(希望有人能更好地回答这个问题
    猜你喜欢
    • 2017-10-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多