Django Rest Framework - 如何序列化嵌套字段
Django Rest Framework - How to serialize nested fields
我有一个 CustomerSerializer
,它使用反向外键字段 images
到 return 所有关联的 Image
对象。
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = ('id', 'name', 'images')
read_only_fields = ('id',)
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
fields = ('id', 'name', 'customer')
read_only_fields = ('id',)
这是我从回复中得到的:
[
{
'id': 1,
'name': 'John Doe',
'images': [
1,
2,
3,
4,
...
]
}
...
]
问题:除了将 images
显示为 id
的列表之外,我如何显示不同的 属性,即 name
?
期望的结果是:
[
{
'id': 1,
'name': 'John Doe',
'images': [
'foo.jpg',
'bar.jpg',
'foobar.jpg',
'lorem.jpg',
...
]
}
...
]
我的第一次尝试 - 我用 SerializerMethodField()
中的 image_names
替换了反向外键 images
以便 select 字段 name
,但是我得到一个 null
值。
class CustomerSerializer(serializers.ModelSerializer):
image_names = serializers.SerializerMethodField()
def get_image_names(self, obj):
return obj.images.name
class Meta:
model = Customer
fields = ('id', 'name', 'image_names')
read_only_fields = ('id',)
附加信息
示例模型:
class Customer(models.Model):
name = models.CharField()
class Image(models.Model):
name = models.CharField()
customer = models.ForeignKey(
Customer, related_name='images', on_delete=models.CASCADE)
如果有任何不清楚的地方,请告诉我,我会更新问题。谢谢。
你需要像下面这样制作另一个序列化器
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
fields = ('name',)
然后如下更新您的 Customerserializer
class CustomerSerializer(serializers.ModelSerializer):
images = ImageSerializer(many=True, read_only=True)
class Meta:
model = Customer
fields = ('id', 'name', 'images')
方法二:
class CustomerSerializer(serializers.ModelSerializer):
images = serializers.SerializerMethodField()
class Meta:
model = Customer
fields = ('id', 'name', 'images')
def get_images(self, obj):
image_names = obj.images.all().values_list('name', flat=True)
return image_names
我有一个 CustomerSerializer
,它使用反向外键字段 images
到 return 所有关联的 Image
对象。
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = ('id', 'name', 'images')
read_only_fields = ('id',)
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
fields = ('id', 'name', 'customer')
read_only_fields = ('id',)
这是我从回复中得到的:
[
{
'id': 1,
'name': 'John Doe',
'images': [
1,
2,
3,
4,
...
]
}
...
]
问题:除了将 images
显示为 id
的列表之外,我如何显示不同的 属性,即 name
?
期望的结果是:
[
{
'id': 1,
'name': 'John Doe',
'images': [
'foo.jpg',
'bar.jpg',
'foobar.jpg',
'lorem.jpg',
...
]
}
...
]
我的第一次尝试 - 我用 SerializerMethodField()
中的 image_names
替换了反向外键 images
以便 select 字段 name
,但是我得到一个 null
值。
class CustomerSerializer(serializers.ModelSerializer):
image_names = serializers.SerializerMethodField()
def get_image_names(self, obj):
return obj.images.name
class Meta:
model = Customer
fields = ('id', 'name', 'image_names')
read_only_fields = ('id',)
附加信息
示例模型:
class Customer(models.Model):
name = models.CharField()
class Image(models.Model):
name = models.CharField()
customer = models.ForeignKey(
Customer, related_name='images', on_delete=models.CASCADE)
如果有任何不清楚的地方,请告诉我,我会更新问题。谢谢。
你需要像下面这样制作另一个序列化器
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
fields = ('name',)
然后如下更新您的 Customerserializer
class CustomerSerializer(serializers.ModelSerializer):
images = ImageSerializer(many=True, read_only=True)
class Meta:
model = Customer
fields = ('id', 'name', 'images')
方法二:
class CustomerSerializer(serializers.ModelSerializer):
images = serializers.SerializerMethodField()
class Meta:
model = Customer
fields = ('id', 'name', 'images')
def get_images(self, obj):
image_names = obj.images.all().values_list('name', flat=True)
return image_names