DRF在create()方法中返回序列化对象

2024-05-23 15:17:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我的模型编写一个自定义的创建方法:

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))

我好像得不到正确的回答。我想返回我的序列化对象,但是

^{pr2}$

以及

HttpResponse(TripReportSerializer(instance))

给了我错误的结果。TripReportSerializer是我用于视图的那个。在


Tags: instancebyobjectsrequestcountorderallpost
2条回答

您需要做的是,serialize the newly created ^{} instance并使用DRF的^{}类返回

from rest_framework.response import Response


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()
        # changes
        serializer = TripReportSerializer(instance)
        return Response(serializer.data)

我发现代码有两个错误:

  1. 要返回序列化程序数据,我认为您应该使用TripReportSerializer(instance).data
  2. Rest框架视图通常返回一个Response对象,它是从rest_framework.response.Response导入的

您应该做的另一个修改是使用viewsget_serializer()方法,这样序列化程序将填充上下文(视图、格式和请求),在您的情况下,这意味着在create方法的末尾使用此代码。在

serializer = self.get_serializer(instance)
return Response(serializer.data)

相关问题 更多 >