首页 > 解决方案 > 如何在 DRF 中获取图像的完整 url?

问题描述

我不擅长英语。我希望你明白。

  1. 日记中可以有多个图像。
  2. 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"
        }
    ]
}

如何获取图片的完整网址?

标签: pythondjangodjango-rest-frameworkimagefield

解决方案


并自动尝试使用from如果它被传递给序列化程序来构建绝对 url FileField。您应该将上下文从您传递到:ImageFieldrequestcontextDiarySerializerDiaryImageSerializer

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

推荐阅读