Django Rest返回绝对URL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django Rest返回绝对URL相关的知识,希望对你有一定的参考价值。

所以我在serializers.py有一个相当直接的序列化器

class ScheduleSerializer(serializers.ModelSerializer):

    class Meta:
        model = FrozenSchedule
        fields = ['startDate', 'endDate', 'client', 'url']

    startDate = serializers.DateField(source='start_date')
    endDate = serializers.DateField(source='end_date')
    client = serializers.StringRelatedField(many=False)
    url = serializers.URLField(source='get_absolute_url')

get_absolute_url在我的models.py

def get_absolute_url(self):
    return reverse('reports:frozenschedule-detail', kwargs={
        'slug': self.client.slug, 'pk': self.id
    })

它与viewsets.py中的ViewSet相关

class ScheduleViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = FrozenSchedule.objects.not_abandoned().future()
        .filter(signed=False).order_by('start_date')
    serializer_class = serializers.ScheduleSerializer

它返回JSON,如下所示:

 [
    {
        "startDate": "2016-10-01",
        "endDate": null,
        "client": "Abscissa.Com Limited",
        "url": "/clients/abscissac/frozenschedule/1",
    }
]

但我希望它返回完整的URL,而不仅仅是相对路径

[
    {
        "startDate": "2016-10-01",
        "endDate": null,
        "client": "Abscissa.Com Limited",
        "url": "http://localhost:8000/clients/abscissac/frozenschedule/1",
    }
]

我可以在我的Serializer中以这种方式序列化URL吗?

Restful文档指出rest_framework reverse函数完全符合我的需要。但它需要请求对象来构建UR http://www.django-rest-framework.org/api-guide/reverse/

答案

覆盖HyperlinkedIdentityField

class UrlHyperlinkedIdentityField(HyperlinkedIdentityField):
   def get_url(self, obj, view_name, request, format):
     if obj.pk is None:
       return None

    return self.reverse(view_name,
        kwargs={
            'slug': obj.client.slug,
            'pk': obj.id,
        },
        request=request,
        format=format,
    )

然后在serializers.py

url = UrlHyperlinkedIdentityField(view_name='reports:frozenschedule-detail')

以上是关于Django Rest返回绝对URL的主要内容,如果未能解决你的问题,请参考以下文章

更改 URL 对 JSON 返回的 Django Rest 框架没有影响

Django REST Framework Viewset 返回 404(GET 请求)

Django REST框架--认证和权限

从 Django REST Framework 中的 APIView 中获取完整的请求 URL

如何从 django 视图中的绝对 url 获取相对 url?

使用 django-rest 框架中的 GET 方法将 url 作为参数传递?