'collections.OrderedDict' 对象没有属性 'pk' - django rest 框架

msl*_*sln 4 python django django-models django-rest-framework django-rest-viewsets

我有一个模型,我想update()为它编写一个方法以进行更新。下面的代码片段是我的模型:

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)
Run Code Online (Sandbox Code Playgroud)

和下面的片段是对应的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
Run Code Online (Sandbox Code Playgroud)

对于更新,我使用以下代码段:

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)
Run Code Online (Sandbox Code Playgroud)

但是当我使用PUT方法发送数据时,它返回以下错误:

/api/class/49/ 处的属性错误

'collections.OrderedDict' 对象没有属性 'pk'

并且错误发生serializer.update(instance=klass, validated_data=serializer.data)在行中。

MKa*_*ras 15

刚刚遇到了同样的错误。

在我的情况下,问题是我serializer.data在做之前访问过serializer.save()

谷歌把我放在这里,所以也许其他人也会觉得这很有帮助。

来源:https : //github.com/encode/django-rest-framework/issues/2964

  • 不保存到数据库的解决方法是访问serializer.validated_data (2认同)