python - Django 列表序列化器批量更新失败, 'QuerySet' 对象没有属性 'pk'

标签 python django django-rest-framework django-views

我正在尝试使用 Viewset 中的 ListSerializer 进行批量更新。我的批量创建工作正常,但不能放置。这是我的 SerializerListSerizlier 和我的 View 。

django=2.0.0

序列化器

class SampleListSerializer(serializers.ListSerializer):
    pass

class SampleSerializer(serializers.ModelSerializer):
    class Meta:
        list_serializer_class = SampleListSerializer
        model = Sample
        fields = ['id', 'name', 'last_name' ]

这是我的ViewSet:


class SampleViewSet(viewsets.ModelViewSet):
    serializer_class = SampleSerializer
    queryset = Sample.objects.all()

    def get_serializer(self, *args, **kwargs):
        if "data" in kwargs:
            data = kwargs["data"]

            # check if many is required
            if isinstance(data, list):
                kwargs["many"] = True

        return super(SampleViewSet, self).get_serializer(*args, **kwargs)

    def put(self, request):
        sorted(request.data, key=lambda o: o["id"])
        instances = Sample.objects.filter(id__in=[o["id"] for o in request.data]).order_by("id")
        try:
            with transaction.atomic():
                ss = SampleSerializer(data=request.data, instance=instances, many=True)
                if ss.is_valid(raise_exception=True):
                    s = ss.save()
                    return Response(ss.data)
                return Response(status=status.HTTP_400_BAD_REQUEST)
        except Exception as e:
            print(f"In exception {e}")
            return Response(status=status.HTTP_400_BAD_REQUEST)

    def create(self, request, *args, **kwargs):
        return super().create(request, *args, **kwargs)

我在 ss.is_valid() 处收到“QuerySet”对象没有属性“pk”的信息。有人可以建议我的错误在哪里吗?或者出了什么问题?

最佳答案

instance 关键字采用单个 QuerySet 对象,但看起来您正在传递一个“List QuerySet”(从技术上讲,它只是一个 QuerySet)。

如果您 print(instances) ,它将看起来像这样(假设您没有重写类的 __str__ 方法):

<QuerySet [<Sample: Sample object(1)>, <Sample: Sample object(2)>, ... ]>

serializers.ModelSerializer 中的某个位置,调用 instance.pk,这将始终导致:

'QuerySet' object has no attribute 'pk'

关于python - Django 列表序列化器批量更新失败, 'QuerySet' 对象没有属性 'pk',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57938045/

相关文章:

python - 我可以从 Django 模板访问字典中的特定键值吗?

python - 将变量 "by name"添加到本地命名空间

python - 如何从 django 模板在 html 页面上打印漂亮的 JSON?

python - 如何从 TastyPie 中的两个外键字段获取数据?

python - 在Python的BeautifulSoup renderContents中,'list'对象没有属性 'items'

python - 在 pytest-django 中每次测试后都会清理数据库

带边框的 python str.replace()

python - 发布到 Tornado 服务器

Django Rest 框架 : pass user from view to serializer

python - DRF Imagefield 上传使用 html 模板而不是 JSON 进行响应