如何在 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)?的主要内容,如果未能解决你的问题,请参考以下文章