继承模型

时间:2018-02-15 08:20:34

标签: django django-rest-framework django-rest-viewsets

我宣布了以下模型:

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模型上工作?

提前谢谢你 彼得

1 个答案:

答案 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')