python - 如何在 DRF 中获取图像的完整 url?

标签 python django django-rest-framework imagefield

我英语不好。我希望你明白。

  1. 日记中可以有多张图片。
  2. 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?

最佳答案

FileFieldImageField 自动尝试使用来自 contextrequest 如果用于构建绝对 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/

相关文章:

python - Django 中的 RESTful API 用于从服务器获取信息

python - Django 休息框架只创建序列化程序字段

python - ArrayFire 和 Python

python - 为什么 softmax 总是提供 1.0 的概率?

Python正则表达式返回包含双字符的单词

python - 如何在 VS Code jupyter 笔记本集成中使用 python 虚拟环境?

javascript - 使用 jQuery 更新/覆盖 HTML 数据?

python - 将 Django 项目从开发迁移到生产时模型丢失错误

python - 通过迭代django模型动态获取模型对象值

python - 如何在 Django Rest Framework 序列化程序中捕获 sql 错误?