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)
免责声明:这个答案并不完整
有人可以解释 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 的一个
例如,我们可以将其重写MusicianSerializer为ListSerializer
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从同一个类继承的(父级和祖级是相同的)
| 归档时间: |
|
| 查看次数: |
16473 次 |
| 最近记录: |