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)
谢谢,任何帮助将不胜感激!
您实际上想要相关字段查看文档,但不清楚如何计算图像的网址,因此我将在下面提出一个解决方案
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)