📅  最后修改于: 2023-12-03 14:40:47.264000             🧑  作者: Mango
Django 是 Python Web 开发中最受欢迎的框架之一,它提供了一个强大的 ORM(对象关系映射)系统来管理数据库中的数据。在 Django 中,通过定义模型类来定义数据库中的表格。本文将介绍 Django 模型中的一些不同之处。
在 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_name
和 last_name
,它们都是 CharField
类型,age
是一个整数类型的字段。
在许多情况下,模型之间需要有某种关系。Django 中的模型关联有四种类型:一对一、一对多、多对一和多对多。
一对一关系表示一个模型实例只与另一个模型实例相关联。例如,一个人只有一个身份证号。
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
实例也将被自动删除。
一对多关系表示一个模型实例可以与多个另一个模型实例相关联。例如,一个电影可以有多个演员。
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
实例。
多对一关系与一对多关系相反 - 它表示多个模型实例可以与一个另一个模型实例相关联。例如,多个学生可以在同一个班级中学习。
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
实例。
多对多关系表示多个模型实例可以彼此相关联。例如,一个电影可以有多个食品“搭配”。
class Food(models.Model):
name = models.CharField(max_length=50)
movies = models.ManyToManyField(Movie)
在 Food
模型中,movies
字段与 Movie
模型建立了多对多的关系。也就是说,一个 Movie
实例可以对应多个 Food
实例,而一个 Food
实例也可以对应多个 Movie
实例。
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()
方法来检索相应的数据。
模型类有一个可选的内部 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 管理数据库中的数据。