2016-09-22 50 views
1

所以我在serializers.pyDjango的Restul返回絕對URL的

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

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

它返回看起來像li的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", 
    } 
] 

我可以序列我的串行內部URL的這種方式?

Restful文檔指出rest_framework reverse函數完全符合我的需要。但它要求請求對象構建UR http://www.django-rest-framework.org/api-guide/reverse/

+0

我們展示了從模型 – sebb

+0

您得到絕對的URL方法,你可以嘗試用'HyperlinkedIdentityField'? –

+0

我認爲我需要tp指定我的視圖名稱像'url = serializers.HyperlinkedIdentityField(view_name ='reports:frozenschedule-detail',lookup_field = {'pk':...})'但我該如何指定查找字段? –

回答

7

重寫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')