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

Python DRF在create()方法中返回序列化对象,python,django-rest-framework,django-serializer,Python,Django Rest Framework,Django Serializer,我正在为我的模型编写一个自定义创建方法: class TripReportViewSet(viewsets.ModelViewSet): permission_classes = (permissions.IsAuthenticatedOrReadOnly,) serializer_class = TripReportSerializer pagination_class = TripReportSetPagination # To order by favori

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

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)


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

我发现代码有两个问题:

  • 要返回序列化程序数据,我认为应该使用
    TripReportSerializer(instance).data
  • Rest框架视图通常返回一个
    Response
    对象,该对象是从
    Rest\u Framework.Response.Response
  • 您应该做的另一个修改是使用views
    get\u serializer()
    方法,以便使用上下文(视图、格式和请求)填充序列化程序,在您的情况下,这意味着在创建方法的末尾使用此代码

    serializer = self.get_serializer(instance)
    return Response(serializer.data)
    
    您需要做的是,使用DRF的类返回

    来自rest\u framework.response导入响应
    类TripReportViewSet(viewsets.ModelViewSet):
    权限\类=(permissions.IsAuthenticatedOrReadOnly,)
    serializer\u class=TripReportSerializer
    分页\u class=TripReportSetPagination
    #要按收藏夹计数或“顶部”订购,请执行以下操作:
    queryset=TripReport.objects.all().annotate(count=count('favoriters')).order_by('-count'))
    #queryset=TripReport.objects.all().order_by('-pk')
    过滤器\后端=(filters.SearchFilter,filters.OrderingFilter)
    搜索字段=('=author\uuuuu username','=slug','countries\uuuuu name',)
    排序_字段=('pk',)
    def创建(自我、请求、**kwargs):
    countries=request.POST['countries'].split(','))
    国家=列表(地图(国际,国家))
    countries=Country.objects.filter(pk\uu in=countries)
    实例=TripReport.objects.create(
    author=User.objects.get(pk=request.POST['author']),
    title=request.POST['title'],
    content=request.POST['content'],
    )
    instance.countries.set(国家)
    save()实例
    #变化
    serializer=TripReportSerializer(实例)
    
    return Response(serializer.data)
    您正在返回
    instance.save()
    在返回您的
    HttpResponse
    @AuroraWang噢,这实际上是stackoverflow的一个输入错误,我试着看看它是否有效。在我的实际代码中,我把它改回来了。
    serializer = self.get_serializer(instance)
    return Response(serializer.data)
    
    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)