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

H.Z*_*hao 2 api django serialization json django-rest-framework

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

楷模 :

class Item(models.Model):

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

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

序列化器:

class ItemSerializer(serializers.ModelSerializer):

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

Run Code Online (Sandbox Code Playgroud)

一个 API 响应:

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

        ...

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

        "images": [
            7,
            8
        ]
    }
Run Code Online (Sandbox Code Playgroud)

我期待这种 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"
        ]
    }
Run Code Online (Sandbox Code Playgroud)

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

Avi*_*KKi 5

您实际上想要相关字段查看文档但不清楚如何计算图像的网址,因此我将在下面提出一个解决方案

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

    @property
    def image_url(self):
        return "{0}{1}".format(settings.MEDIA_URL, self.image.url)
Run Code Online (Sandbox Code Playgroud)

现在在你的序列化器中添加一个与 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"
                  )
Run Code Online (Sandbox Code Playgroud)