0

我声明了以下模型:

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 模型视为 Person ?如何强制 ChildSerializer 在 Child 模型上工作?

提前谢谢你

4

1 回答 1

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)


并尝试如下ModelViewSetviews.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"
}



to editinstance,PUT或者PATCHon /api/vi/sample/instance_idwhereinstance_id是表示实例的整数primary keyChild例如:)/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')
于 2018-02-15T11:12:57.743 回答