我有以下两个模型
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)
答案 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不知道如何将该字典对象转换为可以为您保存到数据库的类别。