继承模型的序列化器
Serializer for inherited model
我声明了以下型号:
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' 被更新。
当我输入 return 时,我收到了正确的回复:
{
"active": true,
"name": "foo"
}
但是名称字段根本没有更新。我更进一步,尝试在序列化程序中实现自定义更新方法:
def update(self, instance, validated_data):
print(str(type(instance)))
return instance
在那之后,在放置响应中我只收到活动字段?:
{
"active": true,
}
在控制台上更令人惊讶:
rest_1 | <class 'applic.models.Person'>
我完全迷路了 :) 究竟为什么序列化程序将显式提供的 Child 模型视为 Person ?如何强制 ChildSerializer 在 Child 模型上工作?
提前致谢
彼得
如下更改您的 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)
并在 views.py
中尝试 ModelViewSet
,如下所示,
class YourViewClass(ModelViewSet):
serializer_class = ChildSerializer
queryset = Child.objects.all()
假设你的api终点是/api/vi/sample/
,那么
到 add
实例,在 /api/vi/sample/
上使用 POST
方法
有效载荷如下
{
"active": true,
"name": "name_choice"
}
edit
实例,PUT
或 PATCH
on /api/vi/sample/instance_id
其中 instance_id
是一个整数,表示 Child
实例的 primary key
(例如:/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')
我声明了以下型号:
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' 被更新。
当我输入 return 时,我收到了正确的回复:
{
"active": true,
"name": "foo"
}
但是名称字段根本没有更新。我更进一步,尝试在序列化程序中实现自定义更新方法:
def update(self, instance, validated_data):
print(str(type(instance)))
return instance
在那之后,在放置响应中我只收到活动字段?:
{
"active": true,
}
在控制台上更令人惊讶:
rest_1 | <class 'applic.models.Person'>
我完全迷路了 :) 究竟为什么序列化程序将显式提供的 Child 模型视为 Person ?如何强制 ChildSerializer 在 Child 模型上工作?
提前致谢 彼得
如下更改您的 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)
并在 views.py
中尝试 ModelViewSet
,如下所示,
class YourViewClass(ModelViewSet):
serializer_class = ChildSerializer
queryset = Child.objects.all()
假设你的api终点是/api/vi/sample/
,那么
到 add
实例,在 /api/vi/sample/
上使用 POST
方法
有效载荷如下
{
"active": true,
"name": "name_choice"
}
edit
实例,PUT
或 PATCH
on /api/vi/sample/instance_id
其中 instance_id
是一个整数,表示 Child
实例的 primary key
(例如:/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')