Django DRF ListSerializer和ListField
我在我的项目中使用django rest,到目前为止,我使用的对象列表都是使用django rest的,因为我需要在Google上搜索到列表的最小长度和最大长度 在此之前,我的代码没有任何错误和不当行为。现在我使用ListField作为列表字段序列化程序,但我不知道何时使用ListSerializer?有人能解释ListSerializer和FieldSerializer之间的区别吗 我的ListSerializer示例代码: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(
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,哪一个更好地使用?为什么?我同时使用了这两种类型,代码工作正常!我有点困惑。不幸的是,我也有点困惑:(希望有人能以更好的方式回答