【问题标题】:Serializer for inherited model继承模型的序列化器
【发布时间】:2018-07-25 22:37:50
【问题描述】:

我声明了以下模型:

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

提前谢谢你 彼得

【问题讨论】:

  • 你的模型不相关是什么关系是1对1、1对多..等等?
  • 您好,当您从另一个模型派生一个模型时,它们的关系是 1 对 1(至少在 db 中看起来像这样),除此之外,没有其他关系
  • 好的,问题出在更新但创建工作正常?
  • 嗨,是的,创作工作正常
  • 您可以添加您的观点吗?

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


【解决方案1】:

如下更改您的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 实例,PUTPATCH 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')

【讨论】:

  • 您好,非常感谢您的解决方案。尽管如此,我仍然非常好奇为什么会这样(因为上面的技巧它是更多的解决方法恕我直言)。对我来说,它看起来像一个错误,但我不确定。谁能给我解释一下?
  • ParentChild 模型是依赖的,它们必须在 OneToOne Relationship 中,正如您在问题中提到的那样。在 Django 中,这就是它的实现方式。这是one to one 关系的官方文档,docs.djangoproject.com/en/2.0/topics/db/examples/one_to_one
  • 简而言之,应该是这样的;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2018-08-01
相关资源
最近更新 更多