码迷,mamicode.com
首页 > 其他好文 > 详细

django之表关系的实现

时间:2020-03-03 21:03:28      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:err   一对一   返回   return   none   补充   学院   默认值   形式   

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之表关系的实现

标签:err   一对一   返回   return   none   补充   学院   默认值   形式   

原文地址:https://www.cnblogs.com/loveprogramme/p/12404144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!