📜  django 模型不同 - Python (1)

📅  最后修改于: 2023-12-03 14:40:47.264000             🧑  作者: Mango

Django 模型不同 - Python

Django 是 Python Web 开发中最受欢迎的框架之一,它提供了一个强大的 ORM(对象关系映射)系统来管理数据库中的数据。在 Django 中,通过定义模型类来定义数据库中的表格。本文将介绍 Django 模型中的一些不同之处。

1. 模型的定义

在 Django 中,通常使用 models.Model 类作为所有模型的父类,这样可以让模型继承一些常用的属性和方法。一个简单的模型例子如下:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    age = models.IntegerField()

在上面的例子中,Person 类继承了 models.Model,并且定义了一些字段,如 first_namelast_name,它们都是 CharField 类型,age 是一个整数类型的字段。

2. 模型关联

在许多情况下,模型之间需要有某种关系。Django 中的模型关联有四种类型:一对一、一对多、多对一和多对多。

2.1 一对一

一对一关系表示一个模型实例只与另一个模型实例相关联。例如,一个人只有一个身份证号。

class Person(models.Model):
    name = models.CharField(max_length=40)

class IDCard(models.Model):
    number = models.CharField(max_length=20, unique=True)
    person = models.OneToOneField(Person, on_delete=models.CASCADE)

IDCard 模型中,person 字段与 Person 模型建立了一对一的关系。当 Person 实例被删除时,与其相关联的 IDCard 实例也将被自动删除。

2.2 一对多

一对多关系表示一个模型实例可以与多个另一个模型实例相关联。例如,一个电影可以有多个演员。

class Movie(models.Model):
    title = models.CharField(max_length=100)
    year = models.IntegerField()

class Actor(models.Model):
    name = models.CharField(max_length=50)
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)

Actor 模型中,movie 字段与 Movie 模型建立了一对多的关系。也就是说,一个 Movie 实例可以对应多个 Actor 实例。

2.3 多对一

多对一关系与一对多关系相反 - 它表示多个模型实例可以与一个另一个模型实例相关联。例如,多个学生可以在同一个班级中学习。

class Class(models.Model):
    name = models.CharField(max_length=20)

class Student(models.Model):
    name = models.CharField(max_length=50)
    my_class = models.ForeignKey(Class, on_delete=models.CASCADE)

Student 模型中,my_class 字段与 Class 模型建立了多对一的关系。也就是说,多个 Student 实例可以关联到同一个 Class 实例。

2.4 多对多

多对多关系表示多个模型实例可以彼此相关联。例如,一个电影可以有多个食品“搭配”。

class Food(models.Model):
    name = models.CharField(max_length=50)
    movies = models.ManyToManyField(Movie)

Food 模型中,movies 字段与 Movie 模型建立了多对多的关系。也就是说,一个 Movie 实例可以对应多个 Food 实例,而一个 Food 实例也可以对应多个 Movie 实例。

3. 模型管理器

Django 的模型管理器是一个管理数据库查询的类,用于提供对模型对象的额外管理方法。每个模型都默认具有一个名为 objects 的管理器,可以用于查询模型实例。

class PersonManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_staff=True)

class Person(models.Model):
    name = models.CharField(max_length=50)
    is_staff = models.BooleanField(default=False)
    objects = models.Manager() # 默认管理器
    staffs = PersonManager() # 自定义管理器

在上面的例子中,Person 模型中定义了一个名为 staffs 的自定义管理器,用于检索 is_staff=True 的人员对象。在查询时,可以使用 Person.staffs.all() 方法来检索相应的数据。

4. 模型的 Meta 选项

模型类有一个可选的内部 Meta 类,它用于存储与模型相关的元数据。以下是其中一些 Meta 选项:

  • db_table - 设置模型对应的数据库表格名。
  • verbose_name - 设置模型在管理后台中显示的名称。
  • ordering - 在查询结果中设置默认排序顺序。
  • unique_together - 限制多个字段的组合的重复性。
  • index_together - 设置多个字段作为联合索引。
class Person(models.Model):
    name = models.CharField(max_length=50)

    class Meta:
        db_table = 'person_tables'
        verbose_name = '个人信息'
        ordering = ['name']

在上面的例子中,Person 模型的元数据中,字段 name 将作为默认排序列,模型对应的数据库表格名为 person_tables,在管理后台中显示的名称为 个人信息

结论

以上就是 Django 模型的一些不同之处。通过了解这些特点,可以更好地使用 Django ORM 管理数据库中的数据。