Vol*_*il3 3 python django abstract-class
我完全了解 MVC 框架以及 Django 如何实现模型和视图。我想知道如何实现自定义层次结构类,然后在 Django 中使用它们。例如:
有一个抽象类Employee,然后是子类;Permanent Employee,Interns等等雇员可以被雇佣和被公司开除。
模型继承的Django工作方式与 Python 中普通类继承的工作方式几乎相同,但仍应遵循页面开头的基础知识。这意味着基类应该子类化django.db.models.Model.
您必须做出的唯一决定是,您是否希望父模型本身成为模型(具有自己的数据库表),或者父模型是否只是仅通过子模型可见的公共信息的持有者。
在 Django 中有三种可能的继承风格。
通常,您只想使用父类来保存您不想为每个子模型输入的信息。这个类不会被单独使用,所以抽象基类是你所追求的。
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)
Run Code Online (Sandbox Code Playgroud)
当您想将一些公共信息放入许多其他模型时,抽象基类很有用。您编写基类并放入abstract=TrueMeta 类。此模型将不会用于创建任何数据库表。相反,当它用作其他模型的基类时,其字段将添加到子类的字段中。抽象基类中的字段与子类中的字段同名是错误的(Django 会引发异常)。
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)
Run Code Online (Sandbox Code Playgroud)
该Student模型将包含三个字段:name、age和home_group。CommonInfo 模型不能用作普通的 Django 模型,因为它是一个抽象基类。它不生成数据库表,也没有管理器,不能直接实例化或保存。
对于许多用途,这种类型的模型继承正是您想要的。它提供了一种在 Python 级别提取公共信息的方法,同时在数据库级别仍然只为每个子模型创建一个数据库表。
如果您对现有模型(可能完全来自另一个应用程序)进行子类化,并希望每个模型都有自己的数据库表,多表继承是可行的方法。
from django.db import models
class CommonInfo(models.Model):
# ...
class Meta:
abstract = True
ordering = ['name']
class Student(CommonInfo):
# ...
class Meta(CommonInfo.Meta):
db_table = 'student_info'
Run Code Online (Sandbox Code Playgroud)
最后,如果您只想修改模型的 Python 级行为,而不以任何方式更改模型字段,您可以使用代理模型。
from django.db import models
class Base(models.Model):
m2m = models.ManyToManyField(
OtherModel,
related_name="%(app_label)s_%(class)s_related",
related_query_name="%(app_label)s_%(class)ss",
)
class Meta:
abstract = True
class ChildA(Base):
pass
class ChildB(Base):
pass
Run Code Online (Sandbox Code Playgroud)
连同另一个应用程序rare/models.py:
from common.models import Base
class ChildB(Base):
pass
Run Code Online (Sandbox Code Playgroud)
有关更多信息,您可能希望继续阅读此处的文档。
有一个维护良好的项目,称为django-mptt,它使用 Django 模型实现修改的预排序树遍历并使用模型实例树。
| 归档时间: |
|
| 查看次数: |
2921 次 |
| 最近记录: |