如何在Django Rest视图中获取媒体的完整URL

3

我正在处理此视图中的图像/媒体/文件,并为文章模型编写了此视图以执行某些工作:

@api_view(["GET"])
def article_grid_list(request):
    # fetched data from the database
    data = Articles.objects.all().order_by("-created_date")[:11]
    pinned_article = Articles.objects.get(pinned=True)

    # serialized data
    pinned_data = ArticlesSerializer(pinned_article)
    horizontal_data = ArticlesSerializer(data[:3], many=True)
    small_data = ArticlesSerializer(data[3:8], many=True)
    card_data = ArticlesSerializer(data[8:], many=True)

    final_data = {
        "pinned":pinned_data.data,
        "horizontal": horizontal_data.data,
        "small": small_data.data,
        "card": card_data.data
    }

当我打印此请求的结果时,我得到像这样的cover字段:"cover": "/media/article/artice_cover_NkOUuZ7vH3zEejCgV.jpg",

但我想要带有主机名的图像URL

当我像ModelViewSet那样编写此函数时,我会得到cover字段的绝对URL,但我想在每个请求中获取图像的绝对URL(主机名+图像路径)

ModelViewSet示例:

class ArticleGridList(viewsets.ModelViewSet):
    queryset = Articles.objects.all().order_by("-created_date")
    serializer_class = ArticlesSerializer

我期望的结果是:

"cover": "http://localhost:8000/media/article/artice_cover_NkOUuZ7vH3zEejCgV.jpg"

我的应用程序 urls.py 文件:

router = routers.SimpleRouter()
router.register('articles', ArticlesViewSet)
urlpatterns = [
  path("article-grid-list/", article_grid_list)
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += router.urls
1个回答

6

您需要在序列化器中像这样发送context = {'request':request} ...

方式-1

# serialized data
pinned_data = ArticlesSerializer(pinned_article,context = {'request':request})
horizontal_data = ArticlesSerializer(data[:3], many=True,context = {'request':request})
small_data = ArticlesSerializer(data[3:8], many=True,context = {'request':request})
card_data = ArticlesSerializer(data[8:], many=True,context = {'request':request})

方法2(使用此方法需要在序列化程序中添加context = {'request':request},类似于上述方法。)

class ArticleSerializer(serializers.ModelSerializer):
    cover = serializers.SerializerMethodField()
    def get_cover(self,obj):
        request = self.context.get('request')
        return str(request.build_absolute_uri(obj.cover.url))

谢谢,第一种方法对我有用(我没有测试第二种方法)为什么?为什么我应该将请求传递给序列化器? - Hasan Vajdi
1
因为请求具有项目URL的完整路径,我的意思是具有项目的绝对URL。 - Mahammadhusain kadiwala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接