0

J'ai un modèle et je veux écrire une méthode update() pour la mettre à jour. L'extrait ci-dessous est mon modèle:'collections.OrderedDict' l'objet n'a pas d'attribut 'pk' - cadre de repos django

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) 

et l'extrait ci-dessous est correspondant 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 

Et pour la mise à jour, j'utilise ci-dessous l'extrait:

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) 

mais quand j'envoie données avec la méthode PUT, il renvoie l'erreur ci-dessous:

AttributeError at /api/class/49/

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

et l'erreur se produit dans la ligne serializer.update(instance=klass, validated_data=serializer.data).

+0

Ce que vous faites ici n'est pas clair. Pourquoi transmettez-vous les données du sérialiseur? –

+1

vous ne devriez pas appeler explicitement 'update()'. Vous devriez juste appeler 'save()' –

+0

Aussi, vous n'avez pas besoin de définir 'update' non plus; De plus, comme pour les formulaires, initial_data sera ignoré si vous transmettez des données explicites. C'est toutes sortes de fautes. –

Répondre

1

Je ne sais pas si cela aide. J'ai toujours ajouter le champ 'id' dans le sérialiseur en raison de ce problème similaire: id = serializers.ModelField (model_field = YourModel._meta.get_field ('id'), required = False) Assurez-vous que c'est nécessaire = Faux parce que quand vous créez un nouvel enregistrement, le champ 'id' n'est pas présent.