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

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

时间: 2024-08-30 03:56:47

django之表关系的实现的相关文章

Django数据模型--表关系(一对多)

一.一对一关系 使用方法:models.ForeignKey(要关联的模型)举例说明:年级.教师和学生 from django.db import models class Grade(models.Model): name = models.CharField(max_length=) class Student(models.Model): name = models.CharField(max_length=) grade = models.ForeignKey(Grade) 注意:外键定

Django博客项目之表关系设计

一.需要创建的表以及表之间的关系 1.User(用户信息表) User表和Blog表是一对一关系,即一个用户对应一个个人站点 2.Blog(个人站点表) 3.Category(文章分类表) Blog和Category表是一对多关系,即一个站点可以有多个分类,但是一个分类只属于一个站点 4.Tag(文章标签表) Blog和Tag表是一对多关系,即一个站点可以有多个标签,但是一个标签只属于一个站点 5.Article(文章表) User和Article表是一对多关系,即一个用户可以有多篇文章,但是一

Django 第十课 3.【ORM表关系】

#表关系 ## 一对多: 1:应用场景:比如文章和作者之间的关系.一个文章只能由一个作者编写,但是一个作者可以写多篇文章.文章和作者之间的关系就是典型的多对一的关系. 2:实现方式:一对多或者多对一,都是通过 'ForeignKey' 来实现的.还是以文章和作者的案例进行讲解. class User(models.Model): username = models.CharField(max_length=20) password = models.CharField(max_length=10

Django 批量插入数据、自定义分页器、多表关系的建立及Form组件(待更新。。。)

目  录 django批量出入数据 自定义分页器 创建多对多表关系的建立 form组件 form组件钩子函数 一.django批量出入数据 视图函数: from app01 import models # 向表中插入1000条数据 def index(request): # 方式1: # for i in range(1000): # models.Book.objects.create(title='第%s本书'%i) # book_Queryset = models.Book.objects

django-创建表的字段属性,表关系

表的各种属性文档:null char ..., django与之对应的文档 https://docs.djangoproject.com/en/1.11/ref/models/fields/   英文 https://yiyibooks.cn/xx/Django_1.11.6/ref/models/fields.html     中文 表关系 class Book(models.Model): headline = models.CharField('大标题', max_length=50) p

数据库 表关系设计参考

表关系设计 出版社表关系 # 出版社表 class Publisher(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=128) phone = models.IntegerField() def __str__(self): return self.name # 作者表 class Author(models.Model): name = models.CharFi

059:表关系之多对多

表关系之多对多场景: 1.应用场景:比如文章和标签的关系.一篇文章可以有多个标签,一个标签可以被多个文章所引用.因此标签和文章的关系是典型的多对多的关.2.实现方式:Django 为这种多对多的实现提供了专门的 Field .叫做 ManyToManyField .还是拿文章和标签为例进行讲解. 示例代码如下: # models.py文件内容: class Tag(models.Model): tname = models.CharField(max_length=100) class Arti

数据库表关系:多对多的三中方式

1.第一种django orm在创建表的时候自动帮我们创建表关系 from django.db import models # Create your models here. #创建book表 class Book(models.Model): name=models.CharField(max_length=32) # 第一种方式,系统帮我们自动创建了表book与表author关系 authors=models.ManyToManyField(to='Author') #创建作者表 clas

ModelSerializer(重点) 基表 测试脚本 多表关系建外键 正反查 级联 插拔式连表 序列化反序列化整合 增删查 封装response

一.前戏要做好 配置:settings.py #注册drf INSTALLED_APPS = [ # ... 'api.apps.ApiConfig', 'rest_framework', ] ? #配置数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'dg_proj', 'USER': 'root', 'PASSWORD': '123', } } """ 在任何(根或者