django之表关系的实现

Posted loveprogramme

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django之表关系的实现相关的知识,希望对你有一定的参考价值。

1、三种表关系在Model类中的对应关系

技术图片

 

 2、以学生表、学生具体信息表、学院表、课程表为例实现上述三种表关系

分析:一个学院有多个学生,因此学院与学生的关系为一对多的关系

     一个学生上多门课,一门课程有多个学生上,因此学生与课程的关系为多对多的关系

     一个学生有一个具体信息表,一个具体信息表对应一个学生,因此学生与学生具体信息表为一对一的关系

技术图片技术图片

 

 3、代码实现

from django.db import models


# Create your models here.
class Department(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)

    def __str__(self):
        return f"Department({self.id}, {self.name})"


class Student(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20)
    department = models.ForeignKey("Department", on_delete=models.CASCADE)
    course = models.ManyToManyField("Course")

    def __str__(self):
        return f"Student({self.id}, {self.name})"


class StudentDetail(models.Model):
    _id = models.OneToOneField("Student", on_delete=models.CASCADE)
    age = models.IntegerField()
    

    def __str__(self):
        return f"StudentDetail({self.id}, {self.age})"


class Course(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)

    def __str__(self):
        return f"Course({self.id}, {self.age})"

4、数据库的表现形式

技术图片

技术图片 技术图片

技术图片

 技术图片

 技术图片

        数据库与代码比较后发现,一个Model类中,一个字段如果是关联字段,在创建数据表时,会在该字段后面,默认加上“_id”,当然,由于多对多是通过主键+联合唯一实现的,就需要创建第三张表,因而在数据库对应的学生表中,没有其创建的与课程有关的字段。

5、补充

  • 三种表关系models.OneToOneField、models.ForeignKey、models.ManyToManyField的第一个参数为所关系的表名(字符串名和类名都可以),但是要注意,如果是类名,所关联的类名必须在本类前面,否则就会报错,建议使用字符串名
  • on_delete参数:为了告知当所关联的表被删除后,如何处理:
  • on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为
    • on_delete=models.CASCADE, # 删除关联数据,与之关联也删除

    • on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做

    • on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError

    • on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)

    • on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)

    • on_delete=models.SET, # 删除关联数据,
           a. 与之关联的值设置为指定值,设置:models.SET(值)
           b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

 

以上是关于django之表关系的实现的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之表的关系

Node.js ORM框架Sequlize之表间关系

Django之表高级操作

Hibernate之表间关系

数据库之表关系

数据库之表关系