如何在 DRF 中序列化一个对象的多个图像(如 url)?

Posted

技术标签:

【中文标题】如何在 DRF 中序列化一个对象的多个图像(如 url)?【英文标题】:How to serialize multiple images(as in url) of an object in DRF? 【发布时间】:2020-01-05 21:16:42 【问题描述】:

我有一个通过 ForeignKey 与 Item 模型相关的 Image 模型,但该资源的 API 端点只显示图像的名称而不是图像的 url。 (我在项目模型中有一个图像文件,可以显示为 url/uri)。那么,如何序列化数据以获取图片的所有媒体 url。

型号:

class Item(models.Model):

    title = models.CharField(max_length=200)
    ...
    img = models.ImageField()

class ItemDetailImg(models.Model):
    item = models.ForeignKey(
        Item, on_delete=models.CASCADE, related_name='images')
    image = models.ImageField()

序列化器:

class ItemSerializer(serializers.ModelSerializer):

    class Meta:
        model = Item
        fields = ("id",
                  "title",
                  ...
                  "images"
                  )

一个 API 响应:


        "id": 16,
        "title": "Venice",

        ...

        "img": "http://127.0.0.1:8000/media/roman-kraft-g_gwdpsCVAY-unsplash.jpg",

        "images": [
            7,
            8
        ]
    

我期待这种 api 响应


        "id": 16,
        "title": "Venice",

        ...

        "img": "http://127.0.0.1:8000/media/roman-kraft-g_gwdpsCVAY-unsplash.jpg",

        "images": [
            "http://127.0.0.1:8000/media/image1.jpg",
            "http://127.0.0.1:8000/media/image2.jpg"
        ]
    

谢谢你,任何帮助将不胜感激!

【问题讨论】:

向我们展示您获得此数据的部分 【参考方案1】:

你其实想要一个相关的领域看看docs,但是不清楚你是如何计算图片的url的,所以我会在下面提出一个解决方案

class ItemDetailImg(models.Model):
    item = models.ForeignKey(
        Item, on_delete=models.CASCADE, related_name='images')
    image = models.ImageField()

    @property
    def image_url(self):
        return "01".format(settings.MEDIA_URL, self.image.url)

现在在您的序列化程序中添加如下所示的 slug 相关字段

class ItemSerializer(serializers.ModelSerializer):
    imges = serializers.SlugRelatedField(many=True, read_only=True, slug_field="image_url")
    class Meta:
        model = Item
        fields = ("id",
                  "title",
                  ...
                  "images"
                  )

【讨论】:

非常感谢。这是正确的做法。它有效。

以上是关于如何在 DRF 中序列化一个对象的多个图像(如 url)?的主要内容,如果未能解决你的问题,请参考以下文章

CREATE 上 DRF 中的多部分图像上传

序列化和反序列化原理

drf框架序列化

drf-CBV

查询1:M相关模型DRF中的对象

DRF保存嵌套对象并更新另一个