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

利用Django的ORM设计数据库模型,简要说明Django中的一对一(OneToOneField)、多对多(ManyToManyField)、一对多(ForeignKey)关系~~以及on_delete参数!

需求是设计一个学生管理系统,可以添加学生信息、学生选择的课程、学生的成绩等等内容~

学生表:Student

id(主键)stu_num(学号)name(姓名)sex(性别)age(年龄)
120190101***19
220190102***18
320190103***20

成绩表:哪个学生的哪一门课程的分数

id(主键)student(外键(学生))course(外键(课程))score(成绩)
11280
23390
32188

课程表:不同的课程(如:语文、数学等)

id(主键)name(课程名称)cou_num(课程编号)
112
233
321

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

  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 命令执行迁移,这几个数据库表就生成了!
本人第一篇博客,谢谢大家的浏览!
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值