DRF возвращает сериализованный объект в методе create () - PullRequest
0 голосов
/ 03 декабря 2018

Я пишу собственный метод создания для моей модели:

class TripReportViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    serializer_class = TripReportSerializer
    pagination_class = TripReportSetPagination
    # To order by favorite count or 'top':
    queryset = TripReport.objects.all().annotate(count=Count('favoriters')).order_by('-count')
    #queryset = TripReport.objects.all().order_by('-pk')
    filter_backends = (filters.SearchFilter, filters.OrderingFilter)
    search_fields = ('=author__username', '=slug', 'countries__name', )
    ordering_fields = ('pk', )

    def create(self, request, **kwargs):
        countries = request.POST['countries'].split(',')
        countries = list(map(int, countries))
        countries = Country.objects.filter(pk__in=countries)

        instance = TripReport.objects.create(
            author=User.objects.get(pk=request.POST['author']),
            title=request.POST['title'],
            content=request.POST['content'],
        )
        instance.countries.set(countries)
        instance.save()
        return HttpResponse(TripReportSerializer(instance))

Кажется, я не могу получить правильный ответ.Я хочу вернуть свой сериализованный объект, но

HttpResponse(instance)

и

HttpResponse(TripReportSerializer(instance))

дают мне неверный результат.TripReportSerializer - это то, что я использую для просмотра.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Что вам нужно сделать, это сериализовать вновь созданный Trip экземпляр и вернуться с помощью DRF Responseкласс

<b>from rest_framework.response import Response</b>


class TripReportViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    serializer_class = TripReportSerializer
    pagination_class = TripReportSetPagination
    # To order by favorite count or 'top':
    queryset = TripReport.objects.all().annotate(count=Count('favoriters')).order_by('-count')
    # queryset = TripReport.objects.all().order_by('-pk')
    filter_backends = (filters.SearchFilter, filters.OrderingFilter)
    search_fields = ('=author__username', '=slug', 'countries__name',)
    ordering_fields = ('pk',)

    def create(self, request, **kwargs):
        countries = request.POST['countries'].split(',')
        countries = list(map(int, countries))
        countries = Country.objects.filter(pk__in=countries)

        instance = TripReport.objects.create(
            author=User.objects.get(pk=request.POST['author']),
            title=request.POST['title'],
            content=request.POST['content'],
        )
        instance.countries.set(countries)
        instance.save()
        <b># changes
        serializer = TripReportSerializer(instance)
        return Response(serializer.data)</b>
0 голосов
/ 04 декабря 2018

Я вижу две вещи не так с кодом:

  1. Чтобы вернуть данные сериализатора, я думаю, вы должны использовать TripReportSerializer(instance).data
  2. Rest Framework Views, как правило, возвращают объект Response, который импортируется из rest_framework.response.Response

Еще одна поправка, которую вы должны сделать, - это использовать метод views get_serializer(), чтобы сериализатор заполнялся контекстом (view, format и request), которыйв вашем случае это будет означать использование этого кода в конце вашего метода создания.

serializer = self.get_serializer(instance)
return Response(serializer.data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...