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)
.
Ce que vous faites ici n'est pas clair. Pourquoi transmettez-vous les données du sérialiseur? –
vous ne devriez pas appeler explicitement 'update()'. Vous devriez juste appeler 'save()' –
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. –