簡體   English   中英

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

[英]Django Rest Framework - How to serialize nested fields

我有一個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', '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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM