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


我们将学习如何在 Django 中创建抽象模型类。

Django 中,抽象模型类是一种用作其他模型继承的模板的模型,而不是旨在创建或保存到数据库的模型。在一个应用程序中,可以使用抽象模型来定义多个模型共享的类似字段和行为。使用 Django,您可以定义一个从 Django.db.models 派生的模型类来建立一个抽象模型类。

模型并将抽象属性设置为 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”。

From django.db import models

class AbstractTimestampedModel(models.Model):
   # Time when the record is created
   created_at = models.DateTimeField(auto_now_add=True)
   # Time when the record is updated
   updated_at = models.DateTimeField(auto_now=True)

   class Meta:
      abstract = True

class ArticleModel(AbstractTimestampedModel):
   # name of the article
   name = models.TextField()
   # author of the article
   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 有一个 rolling 字段,而 EmployeeModel 有一个 employeeNo 字段。

from django.db import models

class 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)

输出

更新于:2023年5月11日

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告