利用Django的ORM设计数据库模型,简要说明Django中的一对一(OneToOneField)、多对多(ManyToManyField)、一对多(ForeignKey)关系~~以及on_delete参数!
需求是设计一个学生管理系统,可以添加学生信息、学生选择的课程、学生的成绩等等内容~
学生表:Student
id(主键) | stu_num(学号) | name(姓名) | sex(性别) | age(年龄) |
---|
1 | 20190101 | *** | 男 | 19 |
2 | 20190102 | *** | 女 | 18 |
3 | 20190103 | *** | 男 | 20 |
成绩表:哪个学生的哪一门课程的分数
id(主键) | student(外键(学生)) | course(外键(课程)) | score(成绩) |
---|
1 | 1 | 2 | 80 |
2 | 3 | 3 | 90 |
3 | 2 | 1 | 88 |
课程表:不同的课程(如:语文、数学等)
id(主键) | name(课程名称) | cou_num(课程编号) |
---|
1 | 1 | 2 |
2 | 3 | 3 |
3 | 2 | 1 |
首先,我们分析一下,我们需要的数据库表以及它们之间的关系:
- 学生信息是一个独立的表(models),里面需要的字段有:name(姓名)、stu_num(学号)、sex(性别)、age(年龄)、courses(选择的课程)等字段;
- 这个时候,我们需要仔细分析一下,会发现:学生与课程之间,应该是多对多的关系(ManyToManyField),因为:一个学生可以选择多门课程进行学习,反过来,一门课程也可以被多个学生选择,所以它们是多对多的关系;
- 当然,学生也会有每次考试的成绩信息等内容,这时候,需要明白它们之间的关系:应该是一对多的关系(ForeignKey),一个学生可以考多次试,可以有多个成绩,所以学生这个表应该是 主键 ,成绩表应该是 从键 。
- 那么,什么时候可以用一对一关系(OneToOneField)呢?当我们需要给一个学生写更多信息时,可以使用一对一关系,比如:学生的身份证号、备注信息、邮箱等信息,我们可以单独设计一个表(models)来存储学生的其他信息,然后和学生信息的表一对一的关联起来就可以了!
以下是简单的models.py代码示例,及说明:
from django.db import models as models
class Course(models.Model):
'''
课程
'''
name = models.CharField(max_length = 30) #课程名称
cou_num = models.CharField(max_length = 20) #课程编号
def __str__(self): #此方法用来在调用Course对象时返回的是课程名称,而不是Object!
return self.name
class Student(models.Model):
'''
学生
'''
name = models.CharField(max_length = 255) #姓名字段
stu_num = models.CharField(max_length = 20) #学号字段
sex = models.CharField() #性别字段
age = models.SmallIntegerField() #年龄字段,这里用的是SmallIntegerField(较的小整数字段),可以占用更小的空间
courses = models.ManyToManyField(Course) #这里,就使用了ManyToManyField,学生与课程之间是多对多的关系
def __str__(self): #这个方法的作用是在调用Student对象时返回学生的名字,而不是一个Object!
return self.name
class Grade(models.Model):
'''
学生课程成绩
'''
course = models.ForeignKey(to = 'course.Course',on_delete = models.CASCSDE)
student = models.ForeignKey(to = 'course.Student',on_delete = models.CASCADE)
score = models.FloatField()
def __str__(self):
return self. score
'''
这里的on_delete参数是必写的,如果不写的话,
在执行python manage.py makemigrations命令时,
会报TypeError,所以必须传这个参数,这里的CASCADE是级联删除的意思,
当主键删除时,从键跟着删除!
'''
而且,在OneToOneField和ForeignKey中都需要传on_delete参数,而ManyToManyField则不需要传这个参数!
最后,在命令行里执行python manage.py makemigrations 生成迁移文件,然后执行python manage.py migrate 命令执行迁移,这几个数据库表就生成了!
本人第一篇博客,谢谢大家的浏览!