0

私はモデルを持っていますので、更新するためにupdate()メソッドを書いてみたいと思います。 以下のスニペットは、私のモデルである:'collections.OrderedDict'オブジェクトに 'pk'属性がありません - django rest framework

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に対応している:

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 

および更新のために、私はスニペットの下に使用します。

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メソッドを使用すると、以下のエラーが返されます。

AttributeError at /api/class/49/

'collections.OrderedDict' object has no attribute 'pk'

serializer.update(instance=klass, validated_data=serializer.data)行でエラーが発生します。

+0

ここで何をしているのかはっきりしません。なぜシリアライザのデータを自分自身に戻しているのですか? –

+1

明示的に 'update()'を呼び出すべきではありません。 –

+0

また、 'update'も定義する必要はありません。フォームと同様に、明示的なデータを渡すと、initial_dataは無視されます。これはすべての種類の間違いです。 –

答えて

1

これが役立つかどうかわかりません。 id = serializers.ModelField(model_field = YourModel._meta.get_field( 'id')、必須= False) これは必ず必須であることを確認してください:False 'id'フィールドが存在しない新しいレコードを作成します。

関連する問題