📜  django 模型不同的模式 - Python (1)

📅  最后修改于: 2023-12-03 15:30:30.544000             🧑  作者: Mango

Django 模型不同的模式

Django 是一种流行的 Web 应用程序框架,内置了强大的 ORM(对象关系映射)功能。ORM 功能通过将数据库数据映射到 Python 对象来简化数据库访问。

Django 模型是 Django ORM 的主要组成部分。模型是 Python 类,用于表示数据库表及其关系。模型定义也是申明性的,这意味着您仅需要指定模型的属性,而 ORM 将自动为您处理与数据库的交互。这使 Django 模型非常易于使用。

Django 模型支持不同的模式,使得您可以组织模型,优化查询并确保模型之间的关联。下面是 Django 模型支持的不同模式:

单个模型模式

这是最基本的模式,其中每个模型都表示一个单独的数据库表。这是最常见的模式,并且在大多数情况下都可以直接使用。

示例代码
from django.db import models

class Employee(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

在此示例中,我们定义了一个 Employee 模型,它表示一个名为 _employee 的数据表中的记录。

抽象基类模式

有时,您需要为多个模型共享相同的属性。在这种情况下,可以创建一个抽象基类,并让其他模型继承它。抽象基类不会创建实际的数据库表,但可以为其他模型提供公共字段和方法。

示例代码
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    birth_date = models.DateField()

    class Meta:
        abstract = True

class Employee(Person):
    employee_number = models.IntegerField()

在此示例中,我们定义了一个抽象 Person 模型,它包含 first_namelast_namebirth_date 字段。我们还定义了一个具体的 Employee 模型,该模型继承自 Person 并添加了一个名为 employee_number 的字段。

多态模式

Django ORM 还支持多态关系,这意味着您可以创建一个模型,该模型可以同时表示不同类别的对象,例如,每个对象都有不同的字段。这是通过使用 Django 中称为 ContentType 的模型来实现的。

示例代码
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey

class Tag(models.Model):
    name = models.CharField(max_length=30)

class TaggedItem(models.Model):
    tag = models.ForeignKey(Tag, on_delete=models.CASCADE)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey()

在此示例中,我们定义了一个 Tag 模型,表示一个标签,另外一个 TaggedItem 模型,表示一个带有标签的对象。content_type 字段与 object_id 字段一起使用,以自动引用所有受支持模型的实例。content_object 字段提供了 content_typeobject_id 字段的简洁访问方法。

自引用模式

Django ORM 还支持自引用关系,这意味着您可以创建一个模型,该模型可以链接到同一模型的其他记录。这对于实现层次结构非常有用。

示例代码
from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=30)
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)

在此示例中,我们定义了一个 Category 模型,它具有一个名为 parent 的外键字段,该字段指向 Category 自身。 related_name 参数为父类别的所有子类别创建了一个反向关系。如果省略 related_name 参数,Django 将使用默认名称 category_set

结论

Django 模型是 Django ORM 的核心组件,支持多种模式和关系类型,使得模型之间的关联变得简单和灵活。在编写应用程序时,您可以根据需要选择不同的模式来优化您的模型和查询。