首页 > 解决方案 > 在django rest框架中使用ModelViewSet时如何获取ImageField的相对url?

问题描述

在 Django 休息框架中使用 ModelViewSet 时,我得到了 ImageField 的绝对 URL。当我使用开发服务器时,它返回http://localhost:8000/media/abc.png这对我来说很好。但是当我使用 nginx 服务器时,它返回的http://localhost/media/abc.png是不正确的。如您所见,图像路径中缺少端口。我将如何使用该 ImageField 的 Nginx 服务器的端口返回相对 url 或绝对 URL?

/模型.py

class BlogPost(models.Model):
    title_image = models.ImageField(upload_to='blog/title_images/%Y/%m/%d', blank=True, null=True)

/序列化程序.py

class BlogListSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogPost
        exclude = ('id',)

/views.py

class BlogViewSet(ModelViewSet):
    parser_classes = (FormParser, JSONParser, MultiPartParser, )
    permission_classes = (AllowAny, )
    authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication, )
    queryset = BlogPost.objects.all()
    serializer_class = BlogListSerializer

标签: pythondjangonginxdjango-rest-frameworkdjango-rest-viewsets

解决方案


你可以这样做。对于 .env 你安装 python-decouple 包。

class BlogListSerializer(serializers.ModelSerializer):

    # Use serializer methodfield to get correct image path
    avatar = serializers.SerializerMethodField()

    def get_avatar(self, data):
        return env('MEDIA_URL') + data['title_image']

   class Meta:
       model = BlogPost
       exclude = ('id','avatar')

推荐阅读