更新通过put获取异常:不正确的类型。预期pk值,收到dict

时间:2018-04-26 06:16:57

标签: django django-rest-framework

我有以下两个模型

alert($scope.Data.idval)

和这个模型

class modelJob(models.Model):
    category            = models.ForeignKey(modelJobCategory,on_delete=models.CASCADE,null=True,default=None,blank=True)
    description         = models.CharField(max_length=200, unique=False)

这是我的两个序列化程序

class modelJobCategory(models.Model):
    name = models.CharField(max_length=200, unique=True)
    other = models.CharField(max_length=200, unique=False , blank=True , null=True)

现在我尝试使用查找字段class Serializer_Update_Job_Serializer(ModelSerializer): class Meta: model = modelJob category = Serializer_Create_List_JobCategory fields = [ 'category', 'description', ] class Serializer_Create_List_JobCategory(ModelSerializer): class Meta: model = modelJobCategory fields = [ 'name', 'other', ] 通过网址上的PUT进行更新 但是我得到了例外

pk

这就是我的观点

{
  "category": [
    "Incorrect type. Expected pk value, received dict."
  ]
}

我知道为什么会收到此错误?

这是我PUT的主体

class UpdateJob_RetrieveUpdateAPIView(RetrieveUpdateAPIView):
    queryset = modelJob.objects.all()
    serializer_class = Serializer_Update_Job_Serializer
    lookup_field = 'id'

    def put(self, request, *args, **kwargs):
        object = self.queryset
        return self.update(request, *args, **kwargs)

1 个答案:

答案 0 :(得分:3)

我相信你需要创建一个'更新'作业序列化程序上的方法。请参阅此处的文档:http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers。默认情况下,序列化程序不了解如何保存嵌套的序列化程序。

您的更新方法可能如下所示:

def update(self, instance, validated_data, id):
    # Perform any updates to the instance you want to do
    # using the validated_data, then save the category
    instance.category = modelJobCategory.objects.get_or_create(
        name=validated_data['category']['name']
    )

更简单,更好的方法是使用可写的SlugRelatedField。因此,将更新作业序列化程序更改为具有以下类别的类别字段:

category = SlugRelatedField(slug_field='name')

这样,当您使用它的类别保存作业时,您只需发送该类别的名称。不是整个类别对象。

如果您想了解错误的含义。 Django休息框架试图找出你工作中要保存的类别。但要做到这一点,它将使用主键。数据库ID。一个整数。您在PUT请求中发送的内容是类别字典,包含名称和说明。但没有数据库ID。并且django不知道如何将该字典对象转换为可以为您保存到数据库的类别。