python - 如何在 DRF 中获取图像的完整 url?
问题描述
我不擅长英语。我希望你明白。
- 日记中可以有多个图像。
- Diary 和 DiaryImage 是 1:N 的关系。
这是我的模型
from django.db import models
from userSystem.models import User
class Diary(models.Model):
id = models.BigAutoField(primary_key=True)
user = models.ForeignKey(User, related_name="diary_user", on_delete=models.CASCADE, null=True)
title = models.CharField(max_length=30)
content = models.CharField(max_length=800)
date_created = models.DateField(auto_now_add=True)
class DiaryImage(models.Model):
diary = models.ForeignKey(Diary, on_delete=models.CASCADE)
image = models.ImageField(default='/media/diary/default_image.jpeg', upload_to='diary',
blank=True, null=True)
这是我的序列化程序
from rest_framework import serializers
from diary.models import DiaryImage, Diary
class DiaryImageSerializer(serializers.ModelSerializer):
image = serializers.ImageField(use_url=True)
class Meta:
model = DiaryImage
fields = ['image']
class DiarySerializer(serializers.ModelSerializer):
images = serializers.SerializerMethodField()
def get_images(self, obj):
image = obj.diaryimage_set.all()
return DiaryImageSerializer(instance=image, many=True).data
class Meta:
model = Diary
fields = ['id', 'title', 'content', 'date_created', 'images']
def create(self, validated_data):
instance = Diary.objects.create(**validated_data)
image_set = self.context['request'].FILES
for image_data in image_set.getlist('image'):
DiaryImage.objects.create(diary=instance, image=image_data)
return instance
这是我的看法
from diary.serializers import DiarySerializer
class DiaryViewSet(viewsets.ModelViewSet):
permission_classes = [permissions.IsAuthenticated, ]
serializer_class = DiarySerializer
def get_queryset(self):
return self.request.user.diary_user.all()
设置.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
网址.py
diary_list = DiaryViewSet.as_view({"get": "list", "post": "create"})
urlpatterns = [
path('admin/', admin.site.urls),
path('diary/', diary_list, name="diary-list"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
当我运行此代码时,图像已成功保存。但是,在加载保存的图像时,不会出现完整的 url。
像这样,
{
"id": 70,
"title": "hello!",
"content": "hello_content",
"date_created": "2021-03-31",
"images": [
{
"image": "/media/diary/DRF_Imagefield_1_xVENDCo.png"
},
{
"image": "/media/diary/django_test_IGFIyYm.png"
}
]
}
如何获取图片的完整网址?
解决方案
并自动尝试使用from如果它被传递给序列化程序来构建绝对 url FileField
。您应该将上下文从您传递到:ImageField
request
context
DiarySerializer
DiaryImageSerializer
class DiarySerializer(serializers.ModelSerializer):
images = serializers.SerializerMethodField()
def get_images(self, obj):
image = obj.diaryimage_set.all()
return DiaryImageSerializer(instance=image, many=True, context=self.context).data
# Rest of code
推荐阅读
- php - PHP Wordpress 中允许的内存大小已用尽
- android-studio - Viewpager2 依赖导致启动时崩溃
- typescript - 如何使用 angular8 上传多个文件
? - python - 将“外部”对象添加到集合时运行代码
- selenium - 定位具有特殊标记名和属性的元素 - 量角器
- java - log4j2.xml 文件在 tomcat webapp 中的正确位置
- java - Gson如何排除JsonSerializer中的一些字段
- powershell - Powershell - Add-OdbcDsn - 即使有效也不为驱动程序设置属性
- php - 在 Centos 7 上无法登录 MySQL 服务器(phpMyAdmin)
- laravel - 如何在多维数组中求和?