[英]Django AttributeError: 'collections.OrderedDict' object has no attribute 'pk'
[英]'collections.OrderedDict' object has no attribute 'pk' - django rest framework
我有一個模型,我想為它編寫一個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)
下面的代碼片段是相應的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
方法發送數據時,它返回以下錯誤:
/api/class/49/ 處的屬性錯誤
'collections.OrderedDict' 對象沒有屬性 'pk'
並且錯誤發生在serializer.update(instance=klass, validated_data=serializer.data)
行中。
剛剛遇到了同樣的錯誤。
就我而言,問題是我在執行serializer.save()
之前訪問了serializer.data
。
谷歌把我放在這里,所以也許其他人也會覺得這很有幫助。
來源: https : //github.com/encode/django-rest-framework/issues/2964
我不知道這是否有幫助。 由於類似的問題,我總是在序列化程序中添加id
字段:
id = serializers.ModelField(model_field=YourModel._meta.get_field('id'), required=False)
確保它是required=False
因為當您創建新記錄時id
字段不存在。
好吧,就我而言,我正在做:
champions_list = []
for champion in champions_serializer.data:
c = {"id": champion.id}
champions_list.append(c)
正確的做法是:
champions_list = []
for champion in champions_serializer.data:
c = {"id": champion["id"]}
champions_list.append(c)
並確保您在序列化程序中返回 id。
這個問題的許多答案都指出在使用serializer.data
之前必須調用serializer.save()
。
就我而言,我肯定是在調用serializer.save()
,但是,我覆蓋了序列化程序上的save
方法,並且沒有在該方法中的序列化self.instance
上設置self.instance
。
因此,如果您要覆蓋save
,請務必執行以下操作:
class MySerializer(serializers.ModelSerializer):
def save(self, *args, **kwargs):
...
self.instance = instance
return self.instance
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.