Django Rest Framework-如何序列化嵌套字段

问题描述

我有一个CustomerSerializer,它使用反向外键字段images返回所有关联的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','customer')
        read_only_fields = ('id',)

这是我从响应中得到的:

[
   {
       'id': 1,'name': 'John Doe','images': [
               1,2,3,4,...
       ]
   }
   ...
]

问题:我不仅要显示images作为id的列表,还如何显示不同的属性,即name

所需的结果将是:

[
   {
       'id': 1,'images': [
               'foo.jpg','bar.jpg','foobar.jpg','lorem.jpg',...
       ]
   }
   ...
]

我的第一次尝试-我用images中的image_names替换了反向外键SerializerMethodField(),以选择字段name,但得到了{{1 }}值。

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','image_names')
        read_only_fields = ('id',)

请让我知道是否有任何不清楚的地方,我将更新问题。谢谢。

解决方法

您需要制作另一个如下的序列化器

class ImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Image
        fields = ('name',)

然后按如下所示更新您的Customerizerializer

class CustomerSerializer(serializers.ModelSerializer):
    images = ImageSerializer(many=True,read_only=True)
    class Meta:
        model = Customer
        fields = ('id','name','images')

方法2:

class CustomerSerializer(serializers.ModelSerializer):
    images = serializers.SerializerMethodField()
    class Meta:
        model = Customer
        fields = ('id','images')
    def get_images(self,obj):
        image_names = obj.images.all().values_list('name',flat=True)
        return image_names