2016-09-22 2 views
1

Так что я довольно прямо вперед сериализатору в serializers.pyДжанго 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 
    }) 

И это связано Viewset в viewsets.py

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

It возвращает JSON, который выглядит li ка это:

[ 
    { 
     "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-адрес таким образом внутри мой Serializer?

В остальной документации указано, что функция rest_framework reverse выполняет именно то, что мне нужно. Но для этого требуется объект запроса для сборки UR http://www.django-rest-framework.org/api-guide/reverse/

+0

показать нам свой ПОЛУЧИТЬ абсолютный метод URL-адрес от модели – sebb

+0

Вы можете попробовать с 'HyperlinkedIdentityField'? –

+0

Я считаю, что мне нужно указать имя моего вида, например 'url = serializers.HyperlinkedIdentityField (view_name = 'reports: frozenschedule-detail', lookup_field = {'pk': ...})', но как указать поля поиска ? –

ответ

7

Переопределить гиперссылкуIdentityField.

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') 
Смежные вопросы