在Django中设计数据库模型,简单描述Django中的一对一(OneToOneField)、多对多(ManyToManyField)、一对多(ForeignKey)关系以及on_delete

利用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

首先,我们分析一下,我们需要的数据库表以及它们之间的关系:

  1. 学生信息是一个独立的表(models),里面需要的字段有:name(姓名)、stu_num(学号)、sex(性别)、age(年龄)、courses(选择的课程)等字段;
  2. 这个时候,我们需要仔细分析一下,会发现:学生与课程之间,应该是多对多的关系(ManyToManyField),因为:一个学生可以选择多门课程进行学习,反过来,一门课程也可以被多个学生选择,所以它们是多对多的关系;
  3. 当然,学生也会有每次考试的成绩信息等内容,这时候,需要明白它们之间的关系:应该是一对多的关系(ForeignKey),一个学生可以考多次试,可以有多个成绩,所以学生这个表应该是 主键 ,成绩表应该是 从键 。
  4. 那么,什么时候可以用一对一关系(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 命令执行迁移,这几个数据库表就生成了!

本人第一篇博客,谢谢大家的浏览!

猜你喜欢

转载自blog.csdn.net/qq_42269354/article/details/86253015