【问题标题】:How to get the complete URL of a media in Django Rest views如何在 Django Rest 视图中获取媒体的完整 URL
【发布时间】:2022-12-23 21:41:39
【问题描述】:

我写了这个观点:

api_view(["GET"])
def article_grid_list(request):
    # fetched data from 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": "/media/article/artice_cover_NkOUuZ7vH3zEejCgV.jpg",

但是当我像 ModelViewSet 这样写这个函数时,我得到了 cover 字段的完整 URL,我想在每个请求中都得到完整的 URL

模型视图集示例:

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您需要像这样在序列化器中发送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))
    

    【讨论】:

    • 谢谢,方法一对我有用(我没有测试方法二)是什么原因?为什么我应该将请求传递给序列化程序?
    • 因为请求有项目 URL 的完整路径,我的意思是有项目的绝对 URL
    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 2012-03-21
    • 2020-12-07
    • 1970-01-01
    • 2021-11-29
    • 2021-04-05
    • 2011-01-21
    相关资源
    最近更新 更多