我正在尝试使用 Viewset
中的 ListSerializer
进行批量更新。我的批量创建工作正常,但不能放置。这是我的 Serializer
、ListSerizlier
和我的 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/