• 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(可执行对象)

  • 相关阅读:
    mybatis 动态sql
    linux shell 之 crontab(定时任务)详解
    FTP定时批量下载文件(SHELL脚本及使用方法 )
    腾讯云数据库团队:MySQL5.7 JSON实现简单介绍
    Chisel Tutorial(七)——模块
    大数问题解决模板
    可靠的功能測试--Espresso和Dagger2
    hdoj 1698 Just a Hook 【线段树 区间更新】
    平衡二叉树
    WPF中DependencyObject与DependencyProperty的源代码简单剖析
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/12404144.html
Copyright © 2020-2023  润新知