前言
“关系管理器”是一个用于处理一对多和多对多关系的管理器
Manager 是一种接口,它赋予了 Django 模型操作数据库的能力。Django 应用中每个模型拥有至少一个 Manager。
一、models代码
from django.db import models
# Create your models here.
class Student(models.Model):
CHICES = [
('男', '男'),
('女', '女')
]
name = models.CharField(help_text='姓名', verbose_name='姓名', max_length=20)
age = models.SmallIntegerField(help_text='年龄', verbose_name='年龄', null=True, blank=True)
# 1: 男 2:女
sex = models.CharField(help_text='性别', verbose_name='性别', null=True, blank=True, default='女',
choices=CHICES, max_length=2)
phone = models.CharField(help_text='电话号码', verbose_name='电话号码', max_length=11, null=True, blank=True,
unique=True)
c_time = models.DateTimeField(help_text='创建时间', verbose_name='创建时间', auto_now_add=True)
channel = models.ForeignKey('Channel', null=True, blank=True, on_delete=models.PROTECT)
def __str__(self):
return self.name
class Meta:
db_table = 'tb_student'
verbose_name = '学生表'
verbose_name_plural = verbose_name
ordering = ['-c_time']
class Channel(models.Model):
title = models.CharField(help_text='渠道名称', verbose_name='渠道名称', max_length=10)
def __str__(self):
return self.title
class Meta:
db_table = 'tb_channel'
verbose_name = '渠道表'
verbose_name_plural = verbose_name
class Course(models.Model):
name = models.CharField(help_text='课程名称', verbose_name='课程名称', max_length=20)
students = models.ManyToManyField('Student', help_text='报课学生', verbose_name='报课学生', through='Entry')
def __str__(self):
return self.name
class Meta:
db_table = 'tb_course'
verbose_name = '课程表'
verbose_name_plural = verbose_name
class Entry(models.Model):
student = models.ForeignKey('Student', on_delete=models.PROTECT)
course = models.ForeignKey('Course', on_delete=models.PROTECT)
c_time = models.DateTimeField('创建时间', auto_now_add=True)
def __str__(self):
return f"{self.student.name}报名了{self.course.name}"
class Meta:
db_table = 'tb_entry'
verbose_name = '报名表'
verbose_name_plural = verbose_name
模型的实例也能访问‘管理器’,只不过,模型实例访问管理器所返回的查询集,是带有过滤的,比如:
# 先创建几个学生s1,s2,s3 几个课程 c1,c2,c3
# 学生s1报名的课程有哪些
s1.course_set.all()
# 打印出来的sql:
'SELECT `tb_course`.`id`, `tb_course`.`name` FROM `tb_course` INNER JOIN `tb_entry` ON (`tb_course`.`id` = `tb_entry`.`course_id`) WHERE `tb_entry`.`student_id` = 6 LIMIT 21', 'time': '0.000'
# 课程c1有哪些学生报名,【students是Course模型中定义的多对多字段】
c1.students.all()
'SELECT `tb_student`.`id`, `tb_student`.`name`, `tb_student`.`age`, `tb_student`.`sex`, `tb_student`.`phone`, `tb_student`.`c_time`, `tb_student`.`channel_id` FROM `tb_student` INNER JOIN `tb_entry` ON (`tb_student`.`id` = `tb_entry`.`student_id`) WHERE `tb_entry`.`course_id` = 2 ORDER BY `tb_student`.`c_time` DESC LIMIT 21', 'time': '0.000'