image.png
表关系(一对一,一对多,多对多)
from django.db import models
# Create your models here.
"""
学生表
包含属性:
姓名、年龄、性别、QQ、电话、创建时间
"""
class Student(models.Model):
name = models.CharField("姓名",max_length=20)#姓名属性,并指定长度
age = models.SmallIntegerField("年龄",null=True)#年龄,可以为空
sex = models.SmallIntegerField("性别",default=1)#性别,默认为1(1表示男)
QQ = models.CharField("QQ号码",max_length=20,unique=True)#QQ号码,指定长度,并设置唯一
phone = models.CharField("电话号码",max_length=20,unique=True)#电话号码,指定长度,并设置唯一
c_time = models.DateTimeField("创建时间",auto_now_add=True)
"""
将学生表与学生详情表关联起来
定义detail,使用models.OneToOneField关联StudentDetail表,实现学生表与学生详情表成一对一关联,
也可以在学生表中写;
on_delete=models.SET_NULL表示当我的学生详情不存在时,学生表表可以存在,但详情为空
与下面的一对一二选一
"""
# detail = models.OneToOneField("StudentDetail",on_delete=models.SET_NULL,null=True)
"""
将学生表与班级表关联起来
定义grade,使用models.ForeignKey关联Grade表,实现班级表与学生表成一对多关联,
on_delete=models.SET_NULL表示当班级不存在时,学生表可以存在,但详情为空
"""
grade = models.ForeignKey("Grade",on_delete=models.SET_NULL,null=True)
def __str__(self):
return "{}-{}".format(self.name,self.age)
"""
学生详情表
包含属性:
学院
学生详情表与学生表成一对一关系
"""
class StudentDetail(models.Model):
college = models.CharField("学院",max_length=20)#学院属性,并指定长度
"""
将学生表与学生详情表关联起来
定义student,使用models.OneToOneField关联Student表,实现学生表与学生详情表成一对一关联,
也可以在学生表中写;
on_delete=models.CASCADE表示当我的学生不存在时,详情表也不能存在,
"""
student = models.OneToOneField("Student",on_delete=models.CASCADE)
"""
班级表
包含属性:
班级名称、班期
班级表与学生表成一对多关系
"""
class Grade(models.Model):
name = models.CharField("班级名称",max_length=20)
num = models.CharField("班期",max_length=20)
"""
课程表
包含属性:
名称、
与学生表是多对多关系
"""
class Course(models.Model):
name = models.CharField("课程名称",max_length=20)
"""
关联学生表,生成迁移的时候自动生成一个中间表
回滚:有的时候我们不需要它自定义的中间表,我们想用自己写的中间表,这时候在进行多对多的时候,
我们在做迁移的时候先将多对多的表注释,然后在取消注释,再次进行迁移,迁移后在进行回滚:
python manage.py migrate 0001
在回滚后要将之前第二次迁移生成的0002文件删除
之后我们就可以写中间表了
through="Enroll":表示在创建好 多对多关系的时候,要指明两张多对多的表是通过Enroll中间表挂钩的
这也是多对多的表与其他关系表不一样的地方
"""
students = models.ManyToManyField("Student",through="Enroll")
"""
中间表
包含属性:
必须有另外两张表对应起来,添加student,course的属性
再添加自定义的属性,pay(钱),报名时间:c_time
"""
class Enroll(models.Model):
"""
对与中间表来说,中间表是连接多对多的桥梁,与另外两张表是一对多的关系,并且一边不存在,那么中间表也将不存在
"""
student = models.ForeignKey("Student",on_delete=models.CASCADE)
course = models.ForeignKey("Course",on_delete=models.CASCADE)
pay = models.FloatField("缴费金额",default=0)
c_time = models.DateTimeField("报名时间",auto_now_add=True)
查看数据库中已完成的表
mysql> show tables;
+----------------------------+
| Tables_in_BasketBall |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| students_course |
| students_enroll |
| students_grade |
| students_student |
| students_studentdetail |
| teacher_student |
+----------------------------+
这样,我们表关系的具体流程就搞定了!
网友评论