我英语不好。我希望你明白。
- 日记中可以有多张图片。
- Diary 和 DiaryImage 是一对一的关系。
这是我的模型
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"
}
]
}
如何获取图片的完整 url?
最佳答案
FileField
和 ImageField
自动尝试使用来自 context
的 request
如果用于构建绝对 url 的序列化程序。您应该将上下文从 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, <b>context=self.context</b>).data
# Rest of code
关于python - 如何在 DRF 中获取图像的完整 url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66883875/