【问题标题】:How can I generate a rest viewset for all child models based on a parent model如何基于父模型为所有子模型生成休息视图集
【发布时间】:2019-09-14 09:08:39
【问题描述】:

我有以下基于共享基础模型的模型:

class Pet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey('auth.User', related_name='pet', on_delete=models.CASCADE)
   name=models.CharField(max=100)

    class Meta:
        abstract = True
        ordering = ['-created']


    def __str__(self):
        return str(self.id)

class Dog(Pet):

    legs = models.BigIntegerField()


class Bird(Pet):

    wings = models.BigIntegerField()
    cage = models.BigIntegerField()

现在,当我请求用户时,我想获得一个看起来像这样的休息 ViewSet:

{
  username: "PeterSchmidt"
  email:"ps@gmail.com"
  pets{
     {
        name="shaggy"
        type="dog"
        legs=4
     }
     {
        name="Jaques"
        type="bird"
        wings=2
        cage=1
     }


}

}

基本上,我想要一种拥有自己视图集的基类模型(多个序列化器都可以)的方法,无论它们是什么类型,我都可以使用它来获取所有宠物。
这可以在标准 django rest 中完成吗?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以使用django-polymorphic 创建多态模型。一般建议是,即使数据库多态性在代码中看起来很干净,也不建议这样做,即使不明显,代码也会变得更复杂。

    我解决这个问题的方法是让一个模型具有不同类型的不同可空字段、类型选择字段,然后是一个带有键 type, data 的包装序列化程序,其中键是动物的类型,数据中是连载的动物。这可以通过使用带有一个SerializerMethodField 的 Pet 模型序列化来完成,该SerializerMethodField 将为每种类型使用不同的序列化器序列化 Pet 的实例。

    Django polymorphic

    Django rest polymorphic

    Realated question - 很好地解释了使用一个序列化器序列化更多模型的方式

    【讨论】:

    • 我想我会选择第二个选项,谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 2018-06-24
    • 1970-01-01
    • 2019-04-08
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多