django-7-补充

前言

“关系管理器”是一个用于处理一对多和多对多关系的管理器

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'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值