📅  最后修改于: 2023-12-03 15:30:30.544000             🧑  作者: Mango
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_name
、last_name
和 birth_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_type
和 object_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 的核心组件,支持多种模式和关系类型,使得模型之间的关联变得简单和灵活。在编写应用程序时,您可以根据需要选择不同的模式来优化您的模型和查询。