'collections.OrderedDict'对象没有属性'pk'-Django Rest Framework [英] 'collections.OrderedDict' object has no attribute 'pk' - django rest framework
问题描述
我有一个模型,我想为其编写一个 update()
方法以进行更新.以下代码段是我的模型:
I have a model and I want to write an update()
method for it in order to update.
The below snippet is my model:
class Klass(models.Model):
title = models.CharField(max_length=50)
description = models.CharField(max_length=500)
university = models.CharField(max_length=50,blank=True, null=True)
teacher = models.ForeignKey(Profile, related_name='teacher', on_delete=models.CASCADE)
,下面的代码段对应于 Serializer
:
and the below snippet is corresponding Serializer
:
class KlassSerializer(ModelSerializer):
teacher = ProfileSerializer()
url = HyperlinkedIdentityField(view_name='mainp-api:detail', lookup_field='pk')
klass_settings = KlassSettingsSerializer()
class Meta:
model = Klass
fields = ('url', 'id', 'title', 'description', 'university','teacher')
def update(self, instance, validated_data):
instance.title = validated_data.get('title', instance.title)
instance.description = validated_data.get('description', instance.description)
instance.university = validated_data.get('university', instance.university)
instance.save()
return instance
为了更新,我使用以下代码段:
And for update, I use below snippet:
class KlassAPIView(APIView):
def put(self, request, pk=None):
if pk == None:
return Response({'message': 'You must specify class ID'}, status=HTTP_400_BAD_REQUEST)
klass = Klass.objects.get(pk=pk)
if request.user.profile.type != 't':
raise PermissionDenied(detail={'message': 'You aren't teacher of this class, so you can't edit information.'})
serializer = KlassSerializer(data=request.data, context={'request': request})
serializer.initial_data['teacher'] = request.user.profile.__dict__
if serializer.is_valid():
serializer.update(instance=klass, validated_data=serializer.data) # Retrieve teacher and store
return Response({'data': serializer.data}, status=HTTP_200_OK)
else:
return Response({'data': serializer.errors}, status=HTTP_400_BAD_REQUEST)
但是当我使用 PUT
方法发送数据时,它返回以下错误:
but when I send data with PUT
method, it returns below error:
/api/class/49/
AttributeError at /api/class/49/
AttributeError
'collections.OrderedDict'对象没有属性'pk'
'collections.OrderedDict' object has no attribute 'pk'
并且错误发生在 serializer.update(instance = klass,validated_data = serializer.data)
行中.
推荐答案
只是遇到了相同的错误.
Just ran into the same error.
在我的情况下,问题是我在执行 serializer.save()
之前访问了 serializer.data
.
In my case the problem was I accessed serializer.data
before doing serializer.save()
.
Google将我放在这里,所以也许其他人也会对此有所帮助.
Google dropped me here, so maybe someone else will also find this helpful.
来源: https://github.com/encode/django-rest-framework/issues/2964
这篇关于'collections.OrderedDict'对象没有属性'pk'-Django Rest Framework的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!