如何在Django中创建抽象模型?

如何在Django中创建抽象模型?,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,我是Django框架的新手,在我的项目中,我有一个名为Layer的模型 class Layer(models.Model): name = models.CharField(max_length=255) 我希望图层与一个称为“几何体”的抽象模型有一个关系,更具体地说,一个图层应该有一个或没有几何体,一个几何体应该属于一个图层 问题是,我对各种类型的几何图形都有不同的属性,因此我决定创建多个几何图形: class Circle(models.Model): radius = m

我是Django框架的新手,在我的项目中,我有一个名为Layer的模型

class Layer(models.Model):
    name = models.CharField(max_length=255)
我希望图层与一个称为“几何体”的抽象模型有一个关系,更具体地说,一个图层应该有一个或没有几何体,一个几何体应该属于一个图层

问题是,我对各种类型的几何图形都有不同的属性,因此我决定创建多个几何图形:

class Circle(models.Model):
    radius = models.CharField(max_length=255)

class Rectangle(models.Model):
    height = models.CharField(max_length=255)
    width = models.CharField(max_length=255)

我想有一个数据结构,其中两个模型是相同的类型(几何)。我想调用layer.geometry,可以得到一个圆、一个矩形或一个十字等等。可能吗?数据库的形状会是什么样子?Django是要创建两个不同的表还是一个具有合并属性的表


提前感谢

Django支持继承,尽管它不是很常见。因此,您可以创建一个模型
几何体
,并让
矩形
继承它:

class Geometry(models.Model):
    pass

class Circle(Geometry):
    radius = models.CharField(max_length=255)

class Rectangle(Geometry):
    height = models.CharField(max_length=255)
    width = models.CharField(max_length=255)
Django将进行迁移,为SQL数据库创建
几何体
矩形
的表。
圆形
矩形
模型将有一个隐式的
OneToOneRelation
到名为
Geometry\u ptr\u id
几何体
的表,从而引用父对象


有关更多信息,请参见上的部分。

尽管您可以将
圆环
矩形
模型链接到
外键
OneToOneField
,但您可以选择为
几何体
模型创建
抽象模型

class Geometry(models.Model):
    id = models.IntegerField()

    class Meta:
        abstract = True

class Circle(Geometry):
    radius = models.CharField(max_length=255)

class Rectangle(Geometry):
    height = models.CharField(max_length=255)
    width = models.CharField(max_length=255)
因此,
Circle
Rectangle
模型都将具有来自
Geometry
模型的id字段,但在数据库中只有2个表。但是,您将无法在
几何图形
模型中查询

class Geometry(models.Model):
    id = models.IntegerField()

    class Meta:
        abstract = True

class Circle(Geometry):
    radius = models.CharField(max_length=255)

class Rectangle(Geometry):
    height = models.CharField(max_length=255)
    width = models.CharField(max_length=255)
如果需要显式查询
几何体
模型,请选择
外键
OneToOneField
选项。如果不是的话,
abstract
模型在我看来是一种更干净的方法


通常,您只需要使用父类来保存不需要为每个子模型键入的信息。这个类永远不会单独使用,因此抽象基类是您所追求的。

您不能与抽象模型建立关系。您可以将其子类化,但该模型仍将有一个表。这样做是为了引入
外键
约束,以防止引用不存在的约束。对,解释得很好。Django允许抽象类,但您不能引用它们。这是否意味着我不能运行layer.geometry?甚至在django rest框架的json响应中都没有?所以,如果一个层有一个圆,它将被称为圆而不是几何体?