【问题标题】:DRF, return serialized data after update object in the viewDRF,在视图中更新对象后返回序列化数据
【发布时间】:2020-07-29 08:43:24
【问题描述】:

我有以下视图以及可以发布或修补数据的自定义创建方法:

class MonthsViewSet(ModelViewSet):
    authentication_classes = (TokenAuthentication,)

    def get_queryset(self):
        # TODO: Workaround until Auth is setup on the front.
        query_set = Month.objects.all() if isinstance(self.request.user, AnonymousUser) \
            else Month.objects.filter(farm__user=self.request.user)
        return query_set

    serializer_class = MonthSerializer

    def create(self, request, *args, **kwargs):
        request_month = request.data['month']
        year = request.data['year']
        farm = request.data['farm']
        days = request.data['days']
        # TODO: understand why built-in update_or_create didn't work here.
        farm_obj = Farm.objects.get(id=farm)
        try:
            month = Month.objects.get(year=year, month=request_month, farm=farm_obj)
            month.days = days
            month.save()
            serializer = MonthSerializer(data=month, many=False, partial=True)
            serializer.is_valid(raise_exception=True)
            return Response(data=serializer.data, status=status.HTTP_200_OK)
        except Month.DoesNotExist:
            Month.objects.create(year=year, month=request_month, farm=farm_obj, days=days)
            return Response(status=status.HTTP_201_CREATED)`

现在我的问题是更新后发回对象的数据,更新成功但我无法序列化该对象后保存并在请求更新一个月时将其发送回响应中,它得到更新但响应是这个错误:

400
Error: Bad Request
[
  {
    "non_field_errors": [
      "Invalid data. Expected a dictionary, but got Month."
    ]
  }
]

我的序列化器:

class MonthSerializer(serializers.ModelSerializer):
    class Meta:
        model = Month
        fields = '__all__'

【问题讨论】:

  • MonthSerializer(data=month,....) DRF 中的问题在data 参数中需要一个类似字典的对象
  • @ArakkalAbu 包含 {'data':month} 等对象的字典还是包含对象字段的字典?

标签: django serialization django-rest-framework


【解决方案1】:

请您分享您的请求内容和您的模型。

在您的 Json 请求中,我认为您正在尝试发送 Month 对象,但序列化程序正在等待 dict 。

也许你的 json 请求应该是:

"month":[ {您的月份对象} ]

【讨论】:

    【解决方案2】:

    我能够通过执行以下操作并根据 Arakkal Abu 的回答来解决它。

        def create(self, request, *args, **kwargs):
            request_month = request.data['month']
            year = request.data['year']
            farm = request.data['farm']
            days = request.data['days']
            farm_obj = Farm.objects.get(id=farm)
            try:
                month = Month.objects.get(year=year, month=request_month, farm=farm_obj)
                month.days = days
                month.save()
                data = {'month': month.month, 'year': month.year, 'date': month.date,
                        'farm': month.farm, 'days': month.days}
                serializer = MonthSerializer(data=data, many=False)
                serializer.is_valid(raise_exception=True)
                return Response(data=serializer.data, status=status.HTTP_200_OK)
            except Month.DoesNotExist:
                month = Month.objects.create(year=year, month=request_month, farm=farm_obj, days=days)
                data = {'month': month.month, 'year': month.year, 'date': month.date,
                        'farm': month.farm, 'days': month.days}
                serializer = MonthSerializer(data=data)
                serializer.is_valid(raise_exception=True)
                return Response(data=serializer.data, status=status.HTTP_201_CREATED)
    

    此代码有效,但对我来说似乎很奇怪。

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 2016-08-14
      相关资源
      最近更新 更多