Django Result return absolute URL's
Question:
So I have a fairly straightforward serializer in 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
in my models.py
def get_absolute_url(self):
return reverse('reports:frozenschedule-detail', kwargs={
'slug': self.client.slug, 'pk': self.id
})
And it’s related ViewSet in viewsets.py
class ScheduleViewSet(viewsets.ReadOnlyModelViewSet):
queryset = FrozenSchedule.objects.not_abandoned().future()
.filter(signed=False).order_by('start_date')
serializer_class = serializers.ScheduleSerializer
It returns JSON which looks like this:
[
{
"startDate": "2016-10-01",
"endDate": null,
"client": "Abscissa.Com Limited",
"url": "/clients/abscissac/frozenschedule/1",
}
]
But I’d like it to return the complete URL, not just the relative path
[
{
"startDate": "2016-10-01",
"endDate": null,
"client": "Abscissa.Com Limited",
"url": "http://localhost:8000/clients/abscissac/frozenschedule/1",
}
]
Could I serialize URL’s this way inside my Serializer?
The Restful documentation states that the rest_framework reverse
function does exactly what I need. But it requires the request object to build the UR
http://www.django-rest-framework.org/api-guide/reverse/
Answers:
Override HyperlinkedIdentityField
. It has the following method,
get_url(self, obj, view_name, request, format)
which can be used to map the object instance to its URL representation. ie,
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,
)
Then in serializers.py
:
url = UrlHyperlinkedIdentityField(view_name='reports:frozenschedule-detail')
So I have a fairly straightforward serializer in 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
in my models.py
def get_absolute_url(self):
return reverse('reports:frozenschedule-detail', kwargs={
'slug': self.client.slug, 'pk': self.id
})
And it’s related ViewSet in viewsets.py
class ScheduleViewSet(viewsets.ReadOnlyModelViewSet):
queryset = FrozenSchedule.objects.not_abandoned().future()
.filter(signed=False).order_by('start_date')
serializer_class = serializers.ScheduleSerializer
It returns JSON which looks like this:
[
{
"startDate": "2016-10-01",
"endDate": null,
"client": "Abscissa.Com Limited",
"url": "/clients/abscissac/frozenschedule/1",
}
]
But I’d like it to return the complete URL, not just the relative path
[
{
"startDate": "2016-10-01",
"endDate": null,
"client": "Abscissa.Com Limited",
"url": "http://localhost:8000/clients/abscissac/frozenschedule/1",
}
]
Could I serialize URL’s this way inside my Serializer?
The Restful documentation states that the rest_framework reverse
function does exactly what I need. But it requires the request object to build the UR
http://www.django-rest-framework.org/api-guide/reverse/
Override HyperlinkedIdentityField
. It has the following method,
get_url(self, obj, view_name, request, format)
which can be used to map the object instance to its URL representation. ie,
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,
)
Then in serializers.py
:
url = UrlHyperlinkedIdentityField(view_name='reports:frozenschedule-detail')