在Django中创建抽象模型类的方法?
本篇文章将介绍如何在Django中创建抽象模型类。
在Django中, 抽象模型类 是指一个不属于具体模型,而是作为其他模型的模板进行继承的模型。在应用程序中,可以使用抽象模型定义多个模型共享的字段和行为。使用Django时,需要定义一个由 Django.db.models 派生的模型类来建立抽象模型类。
用 Model 定义一个模型类,并将抽象属性设置为True。这个抽象类的属性和方法都将被任何继承它的模型继承,但不会创建新的数据库表。
抽象模型 可以定义字段、方法和元数据,就像标准模型一样。Django提供了许多字段类,比如CharField、IntegerField和ForeignKey,可以用来描述字段。可以创建方法来实现特定的行为,例如计算属性、自定义查询或验证。
在Django中,从抽象模型继承遵守与传统模型相同的指导方针。所有在超级类中声明的字段和方法都将被子类继承,子类可以按需要替换或添加它们。当开发从抽象模型派生的新模型时,抽象属性不应设置为True。
要在Django应用程序中使用抽象模型,它必须是一个已安装的应用程序的一部分,并且必须通过运行所需的迁移创建任何新的数据库表或字段。
创建抽象模型类的步骤
-
步骤1 − 设立一个派生自django.db.models的模型类。你的抽象模型类使用一个模型,这个类可以有任何你喜欢的名称,但一个准确描述它在应用程序中所执行操作的名称是个好主意。
-
步骤2 − 提供你的具体模型应该继承抽象模型类的任何属性或标准字段。这可以包括你希望所有模型都具有的任何自定义方法或属性,以及例如CharField、DateField、TextField等字段。
-
步骤3 − 在抽象模型类中添加一个名为Meta的内部类,将抽象属性设置为True。Django将会知道这是一个抽象模型类,则不会为它创建单独的数据库表。
-
步骤4 − 提供抽象模型类所需的具体模型类。每个具体模型的额外变量和操作可以按需要定义。
-
步骤5 − 执行迁移以构建具体模型所需的数据库表。
通过建立抽象模型类,可以指定应用程序中各种模型共享的标准字段和行为。增加代码的重用性并避免重复可以帮助您编写更易于维护的代码。
示例1
在这个例子中,我们将创建一个在Django中的抽象模型类,并用它来更好地理解。在models.py文件中,我们首先创建了名为“AbstractTimestampedModel”的抽象类,它包含两个字段“created_at”和“updated_at”。如果没有指定任何内容,这些字段的默认值将被填充为当前时间。我们创建了另一个名为“ArticleModel”的模型,它需要这个抽象模型作为参数并使用这些字段。它包含两个字段:“name”和“author”。
从django.db导入模型
类AbstractTimestampedModel(models.Model):
#记录创建时间
created_at = models.DateTimeField(auto_now_add=True)
#记录更新时间
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class ArticleModel(AbstractTimestampedModel):
#文章名称
name = models.TextField()
#文章作者
author = models.TextField()
class Meta:
db_table = 'myapp_articlemodel'
创建这两个类后,需要运行以下命令 –
python manage.py makemigrations
python manage.py migrate
python manage.py shell
然后,我们需要运行以下命令将记录添加到数据库并打印其值。通过以下命令创建记录 –
>>> from myapp.models import ArticleModel >>> article = ArticleModel(name='Tutorialspoint Article', author='ABC XYZ')
>>> article.save()
然后,我们需要运行以下命令来打印插入记录的值-
>>> from myapp.models import ArticleModel
>>> article = ArticleModel.objects.first()
>>> print("Article name: ", article.name, "\nAuthor: ", article.author, "\nCreated At: ", article.created_at, "\nUpdated At: ", article.updated_at)
输出
示例2
在此示例中,我们使用类似的方法创建抽象模型,但是这里我们在两个单独的模型中使用相同的抽象模型。抽象模型名称为“AbstractUserModel”,其中存储用户的姓名和出生日期。我们的两个模型是“ StudentModel”和“ EmployeeModel”。StudentModel具有滚动字段,而EmployeeModel具有employeeNo字段。
从django.db导入模型
类AbstractUserModel(models.Model):
#姓名
name = models.TextField()
#出生日期
dob = models.TextField()
class Meta:
abstract = True
class StudentModel(AbstractUserModel):
#滚动字段
roll = models.IntegerField()
class Meta:
db_table = 'myapp_studentmodel'
class EmployeeModel(AbstractUserModel):
#员工编号
employeeNo = models.IntegerField()
class Meta:
db_table = 'myapp_employeemodel'
这些数据库模型必须执行相同的步骤才能迁移。执行这些步骤后,执行以下操作以创建并打印记录。
>>> from myapp.models import StudentModel,EmployeeModel
>>> student = StudentModel(name='ABC Student', dob='01/01/2023', roll=123)
>>> student.save()
>>> employee = EmployeeModel(name='XYZ Employee', dob='12/12/2023', employeeNo=111)
>>> employee.save()
>>>
>>> student = StudentModel.objects.first()
>>> employee = EmployeeModel.objects.first()
>>>
>>> print("Name: ", student.name, "\nDOB: ", student.dob, "\nRoll: ", student.roll)
>>> print("Name: ", employee.name, "\nDOB: ", employee.dob, "\nEmployee No: ", employee.employeeNo)