我宣布了以下模型:
class Parent(models.Model):
active = models.BooleanField(default=False)
class Child(Parent)
name = models.CharField(max_length=100, unique=True)
和序列化器:
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
fields = ('active', 'name')
乍一看,一切似乎都没问题,它在可浏览的api中正确生成。当我想仅更新两个字段并且活跃'已更新。
当我做出回应时,我得到了正确的共鸣:
{
"active": true,
"name": "foo"
}
但名称字段根本没有更新。我进一步尝试在序列化器中实现自定义更新方法:
def update(self, instance, validated_data):
print(str(type(instance)))
return instance
之后在put响应中我只收到活动字段?:
{
"active": true,
}
在控制台上更令人惊讶:
rest_1 | <class 'applic.models.Person'>
我完全迷失了:)为什么地球上的序列化器会将明确提供的Child模型视为一个人?如何强制ChildSerializer在Child模型上工作?
提前谢谢你 彼得
答案 0 :(得分:0)
如下所示更改models.py
,
class Parent(models.Model):
active = models.BooleanField(default=False)
class Child(Parent):
parent = models.OneToOneField(Parent)
name = models.CharField(max_length=100, unique=True)
并在ModelViewSet
中尝试views.py
,如下所示,
class YourViewClass(ModelViewSet):
serializer_class = ChildSerializer
queryset = Child.objects.all()
假设你的api终点是/api/vi/sample/
,那么
到add
实例,在POST
上使用/api/vi/sample/
方法
有效载荷如下
{
"active": true,
"name": "name_choice"
}
edit
上的PUT
实例,PATCH
或/api/vi/sample/instance_id
,其中instance_id
是表示primary key
实例的Child
的整数(例如:/api/vi/sample/1
)。更新了有效负载,如下所示,
{
"active": false,
"name": "name_choice_new_change"
}
如果您想查看instance_id
,请按以下步骤更新serializer
,
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
fields = ('id', 'active', 'name')