美文网首页django
模型继承之抽象基类

模型继承之抽象基类

作者: 陆_志东 | 来源:发表于2018-08-23 23:00 被阅读62次

抽象基类的原因:

当你想将一些共有信息放进其它一些model的时候,抽象化类是十分有用的。
当你编写完模型类之后,在Meta类中设置abstract=True ,这个模型就不会被用来创建任何数据表.
取而代之的是,当它被用来作为一个其他model的基类时,它的字段将被加入那些子类中。如果抽象基类和它的子类有相同的字段名,那么将会出现error
示例:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)

#Student 模型将有三个项:name, age 和 home_group。CommonInfo 模型无法像一般的Django模型一样使用,因为它是一个抽象基类。
#它无法生成一张数据表或者拥有一个管理器,并且不能实例化或者直接储存。

#许多应用场景下, 这种类型的模型继承恰好是你想要的。
#它提供一种在 Python 语言层级上提取公共信息的方式,同时在数据库层级上,每个子类各自仍然只创建一个数据库表。

抽象基类的时候一定要小心related_name 反向引用

因为Django 会将基类字段添加到每个子类当中,而每个子类的字段属性值都完全相同 (这里面就包括related_name)。
解决办法:添加related_name字段值的时候加上%(app_label)s%(class)s

  • '%(class)s' 会替换为子类的小写加下划线格式的名称,字段在子类中使用。
  • '%(app_label)s' 会替换为应用的小写加下划线格式的名称,应用包含子类。每个安装的应用名称都应该是唯一的,而且应用里每个模型类的名称也应该是唯一的,所以产生的名称应该彼此不同。

例:

from django.db import models

class Base(models.Model):
    m2m = models.ManyToManyField(OtherModel, related_name="%(app_label)s_%(class)s_related")

    class Meta:
        abstract = True

class ChildA(Base):  # ChildA.m2m 字段的反向名称是 common_childa_related,
    pass

class ChildB(Base):  #  ChildB.m2m 字段的反向名称是 rare_childb_related。
    pass

如果你没有在抽象基类中为某个关联字段定义related_name 属性,
那么默认的反向名称就是子类名称加上'_set',它能否正常工作取决于你是否在子类中定义了同名字段。

在上面的代码中,如果去掉 related_name 字段 ,在ChildA中,m2m 字段的反向名称就是的反向名称就是childa_set,
而 ChildB的 m2m 字段的反向名称就是 childb_set。

相关文章

  • 模型继承之抽象基类

    抽象基类的原因: 当你想将一些共有信息放进其它一些model的时候,抽象化类是十分有用的。当你编写完模型类之后,在...

  • 模型基类常用方法

    模型基类 模型继承基类 最后控制器调用

  • python之抽象基类

    python之抽象基类 抽象基类,在这个类中定义一些方法,所有继承这个类的类必须实现这个方法,并且这个类不能被实例...

  • ★01.基础概念

    抽象类:含有虚函数的类。 抽象基类:含有纯虚函数的类。 虚基类:多重继承中虚继承的基类。 类静态数据成员的定义必须...

  • Lession09抽象类和接口

    抽象类 继承练习 接口 继承基类并实现接口

  • bridge模式

    写法跟其他模式类型,就因为理解的含义不同? 一个继承抽象基类,一个继承实现基类,抽象类里面有个实现类的指针 bri...

  • 深入理解类和对象

    1.1 抽象基类(abc模块) python的抽象类的写法,继承抽象类的类必须要实现抽象方法,否则会报错 1.2 ...

  • 自定义实现克隆对象的两种方法

    方法1 定义基类 模型继承基类 使用 方法2 定义扩展方法 用法

  • 虚基类

    经提取,存有公共元素的,被虚继承的祖父类,称为虚基类。虚基类,需要设计 和抽象 虚继承,是一种继承的扩展。 cla...

  • 文本查询程序

    //面向对象的核心是,抽象继承多态。抽象把数据实现隐藏,暴露公共接口继承和多态,派生类继承基类,降低代码重复性,通...

网友评论

    本文标题:模型继承之抽象基类

    本文链接:https://www.haomeiwen.com/subject/jmrviftx.html