2016-08-22 2 views
1

У меня есть модель Foo, которую я использую в качестве модели для моего ванильного сериализатора DRF.Как настроить ответ Django REST Framework GET?

models.py

class Foo(models.Model): 
    name = models.CharField(max_length=20) 
    description = models.TextField() 
    is_public = models.BooleanField(default=False) 

serializers.py

class FooSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Foo 

views.py

class FooRetrieveAPIView(RetrieveAPIView): 
    queryset = Foo.objects.all() 
    serializer_class = FooSerializer 

Теперь результат т его конечная точка используется интерфейсным кодом, который затем является основой того, как будет отображаться следующая страница. В любом случае мне нужно изменить структуру результатов, возвращенных как для статуса 200 (существующая запись), так и для 404 (несуществующая запись).

Фактический результат (от ванили ФПИ):

$ curl localhost:8000/foo/1/ # existing record 
{"id": 1, "name": "foo", "description": "foo description", is_public=false} 

$ curl localhost:8000/foo/2/ # non-existent record 
{"detail": "Not found."} 

Как я хочу, чтобы результаты были:

$ curl localhost:8000/foo/1/ 
{"error": "", "foo": {"id": 1, "name": "foo", "description": "foo description", is_public=false}} 

$ curl localhost:8000/foo/2/ 
{"error": "Some custom error message", "foo": null} 

Я в основном используется ваниль DRF так все довольно просто поэтому эта настройка структуры ответа для меня немного нова.

Джанго используется версия: 1.9.9

DRF используется версия: 3.3.x

+0

Возможный дубликат http://stackoverflow.com/questions/35019030/how-to-return-custom-json-in-django-rest-framework – JClarke

ответ

1

Вы можете переписать retrieve метод в целях того, чтобы обновить данные ответа Serializer

class FooRetrieveAPIView(RetrieveAPIView): 
    queryset = Foo.objects.all() 
    serializer_class = FooSerializer 

    def retrieve(self, request, *args, **kwargs): 
     instance = self.get_object() 
     serializer = self.get_serializer(instance) 
     data = serializer.data 
     # here you can manipulate your data response 
     return Response(data) 
+0

Спасибо. Это работало для ответа «200». Мне нужно было выполнить обработку исключений, чтобы получить ответ «404». – baktin

0

У меня была аналогичная проблема, и я не хотел создавать настраиваемый обработчик исключений, так как я хотел больше контролировать определение сообщений об ошибках для вызова api s. После небольшого удара рукой я использовал следующий код в представлении, чтобы получить сообщение об ошибке при обновлении записи с помощью partial_update.

def partial_update(self, request, *args, **kwargs): 
    partial = kwargs.pop('partial', False) 
    try: 
     instance = self.get_object() 
     serializer = self.get_serializer(instance, data=request.data, partial=partial) 
     serializer.is_valid(raise_exception=True) 
     self.perform_update(serializer) 
     headers = self.get_success_headers(serializer.data) 
     response = {"status": "True", "message": "", "data": serializer.data} 
     return Response(response, status=status.HTTP_201_CREATED, headers=headers) 
    except exception.Http404: 
     headers = "" 
     response = {"status": "False", "message": "Details not found", "data": ""} 
     return Response(response, status=status.HTTP_200_OK, headers=headers) 
Смежные вопросы