*** detail表级联 student表,detail获取student的学生信息,自己做为扩展
一对一关系     models.OneToOneField
student = models.OneToOneField('Student', on_delete=models.CASCADE)
# 一对一关系
  # 级联表,在从表中定义 OneTOOndeFideld on_delete=models.CASCADE 你删我就
    # 'student为表名, 加引号是为了防止 student 定义在下面而引出报错,' on_delete=models.CASCADE 表示,当主表中的数据被删除时,关联表中的信息自动被删除
如果 student表中的信息被删除, detail中的信息 自动删除

***  student表对应 Grade表,一个学生只能在一个年级里, 一对多关系 ,(学生去grade表中获取 班级信息)
  grade = models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True)  # 一个班级可以对应多个学生,一对多关系
# 当'Grade 表的 年级被删除时, Student 表中的grade 字段的值为Null, null= True允许为null'
#  在主表学生中 增加grade 字段  建立1对多关联,如果 年级信息在 Grade表中 被删除 ,则学生表中 修改为 null

class Student(models.Model):
name = models.CharField(max_length=20)
sex = models.SmallIntegerField(default=0)
age = models.SmallIntegerField(default=0)
grade = models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True) # 一个班级可以对应多个学生,一对多关系
# 当'Grade 表的 年级被删除时, Student 表中的grade 字段的值为Null, null= True允许为null'
qq = models.CharField(max_length=20, default='')
phone = models.CharField(max_length=20, default='')
c_time = models.DateField(verbose_name='当前UTC时间', auto_now_add=True) def __str__(self):
'''
让查询print更友好
:return:
'''
return '%s-%s' % (self.name, self.age) class StuendtDetail(models.Model):
num = models.CharField(max_length=20, default='')
college = models.CharField(max_length=50, default='')
student = models.OneToOneField('Student', on_delete=models.CASCADE)
# 一对一关系
  # 级联表,在从表中定义 OneTOOndeFideld
# 'student为表名, 加引号是为了防止 student 定义在下面而引出报错,' on_delete=models.CASCADE 表示,当主表中的数据被删除时,关联表中的信息自动被删除 def __str__(self):
return '%s-%s' % (self.num, self.college)
class Course(models.Model):
name = models.CharField('课程名称', max_length=20)
students = models.ManyToManyField('Student', through='Enroll') # 通过 Enroll表确定关系.
如果第三张 中间表,不需要再添加字段,student_id,couser_id外的其他字段.,系统会自己建表
class Enroll(models.Model):
student = models.ForeignKey('Student', on_delete=models.CASCADE) # 如果学生记录被删除,报名表中的记录也删除
course = models.ForeignKey('Course', on_delete=models.CASCADE) # 如果课程被删除,报名表报门课的记录也删除
student = models.FloatField('缴费金额', default=0)
student = models.DateTimeField('创建时间', auto_now_add=True)

表关系  :一对一

models.OneToOneField('Student', on_delete=models.CASCADE)  
一对多:
models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True)  # 一个班级可以对应多个学生,一对多关系
多对多:
models.ManyToManyField('Student', through='Enroll')  # 通过 Enroll

参数:
on_delete=models.CASCADE  级联关系,你删除我也删除
on_delete=models.SET_NULL, null=True  你删除,我变成NULL ,允许为null

1# python manager.py makemigrations APP_name   # 创建 迁移 
2# python manager.py sqlmigrate 0001     # 查询 迁移的sql 
BEGIN;
--
-- Create model Course
--
CREATE TABLE `teatcher_course` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(20) NOT NULL);
--
-- Create model Enroll
--
CREATE TABLE `teatcher_enroll` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `pay` double precision NOT NULL, `c_time` datetime(6) NOT NULL, `course_id` integer NOT NULL);
--
-- Create model Grade
--
CREATE TABLE `teatcher_grade` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(20) NOT NULL UNIQUE, `num` varchar(20) NOT NULL);
--
-- Create model Student
--
CREATE TABLE `teatcher_student` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(20) NOT NULL, `sex` smallint NOT NULL, `age` smallint NOT NULL, `qq` varchar(20) NOT NULL, `phone` varchar(20) NOT NULL, `c_time` date NOT NULL, `grade_id` integer NULL);
--
-- Create model StudentDetail
--
CREATE TABLE `teatcher_studentdetail` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `num` varchar(20) NOT NULL, `college` varchar(50) NOT NULL, `student_id` integer NOT NULL UNIQUE);
--
-- Add field student to enroll
--
ALTER TABLE `teatcher_enroll` ADD COLUMN `student_id` integer NOT NULL;
--
-- Add field student to course
--
ALTER TABLE `teatcher_enroll` ADD CONSTRAINT `teatcher_enroll_course_id_f82a2519_fk_teatcher_course_id` FOREIGN KEY (`course_id`) REFERENCES `teatcher_course` (`id`);
ALTER TABLE `teatcher_student` ADD CONSTRAINT `teatcher_student_grade_id_2b582310_fk_teatcher_grade_id` FOREIGN KEY (`grade_id`) REFERENCES `teatcher_grade` (`id`);
ALTER TABLE `teatcher_studentdetail` ADD CONSTRAINT `teatcher_studentdeta_student_id_a4c3f4c0_fk_teatcher_` FOREIGN KEY (`student_id`) REFERENCES `teatcher_student` (`id`);
ALTER TABLE `teatcher_enroll` ADD CONSTRAINT `teatcher_enroll_student_id_72c0a309_fk_teatcher_student_id` FOREIGN KEY (`student_id`) REFERENCES `teatcher_student` (`id`);
COMMIT;
3# ptyhon manager.py migrate app_name    #  生成数据库表
(py36dj21) pyvip@vip:~/code/crm$ python manage.py migrate teatcher
Operations to perform:
Apply all migrations: teatcher
Running migrations:
No migrations to apply. #不生成表
#删除   django_migrations;后

再 python manager.py migrate app_name  表创建成功.

mysql> drop tables django_migrations;
Query OK, 0 rows affected (0.06 sec)
from django.db import models

# Create your models here.

class Student(models.Model):
name = models.CharField(max_length=20)
sex = models.SmallIntegerField(default=0)
age = models.SmallIntegerField(default=0)
qq = models.CharField(max_length=20, default='')
phone = models.CharField(max_length=30,default='')
c_time = models.DateTimeField('创建时间', auto_now_add=True) # auto_now_add 只加一次
m_time = models.DateTimeField('修改时间', auto_now=True) # auto_now 每次修改 会更新
is_delete = models.BooleanField('是否被标记为删除',default=False) def __str__(self): # 用于 print(格式化内容)
return '%s-%s' % (self.name, self.age) class Grade(models.Model):
mame = models.CharField('Django框架',max_length=50,unique=True)
num = models.CharField('33期',max_length=20, unique=True) def __str__(self):
return '%s-%s' % (self.num, self.name) class StudentDetail(models.Model):
high = models.SmallIntegerField(verbose_name='身高',default=0)
weight = models.SmallIntegerField(verbose_name='体重',default=0)
introduction = models.TextField(verbose_name='简介',default='')
student = models.OneToOneField('Student',on_delete=models.CASCADE) class Couser(models.Model):
name = models.CharField(verbose_name='课程名称',max_length=20)
student = models.ManyToManyField('Student', through='Enroll') # 多对多,通过Enroll这个表.查询时 通过Student直接访问到Couser class Enroll(models.Model):
student = models.ForeignKey('Student',on_delete=models.CASCADE) # 一对多,一个学生选多个课程,用ForeignKey on_delete=models.CASCADE时,当 Students表中的课程被删除,相关记录自动删除
course = models.ForeignKey('Couser', on_delete=models.CASCADE) #on_delete=models.CASCADE(级联操作,保持同步)时,当 Couser表中的课程被删除,相关记录自动删除
pay = models.FloatField(verbose_name='金额',default=0)
												

djjango models表关系的更多相关文章

  1. 八.django模型系统(二)之常用查询及表关系的实现

    Ⅰ.常用查询  1.几个概念 每一个django模型类,都有一个默认的管理器,objects,查询就是依赖于objects管理器进行的(在创建时就被添加了). QuerySet表示数据库中对象的列表( ...

  2. (33)关于django中路由自带的admin + 建表关系的讲解

    admin是django自带的后台管理,在初始的时候就默认配置好了 当输入ip地址的时候后面跟admin,就会登陆管理员的后台,这个是django自带的,可以快速管理数据表(增删改查) PS:ip地址 ...

  3. Django 表关系

    1.自定义主键字段的创建 AutoFiled(pirmary_key=True) # 一般不会自定义2.order_by asc desc 1. 表关系的创建- OneToOne student = ...

  4. 5.Django|模型层--多表关系

    多表操作 文件为 ---->  orm2 数据库表关系之关联字段与外键约束 一对多Book id title price publish email addr php 人民出版社 北京 pyth ...

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

    表的各种属性文档:null char ..., django与之对应的文档 https://docs.djangoproject.com/en/1.11/ref/models/fields/   英文 ...

  6. Django框架基础知识07-常用查询及表关系的实现

    1.常用的模型字段类型 https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types 2.字段的常用参数 官方文档:http ...

  7. Django——7 常用的查询 常用的模型字段类型 Field的常用参数 表关系的实现

    Django 常用的查询 常用的查询方法 常用的查询条件 常用字段映射关系 Field常用参数 表关系的实现 查用的查询方法 这是需要用到的数据 from django.http import Htt ...

  8. Django入门--模型系统(二):常用查询及表关系的实现

    1.常用查询 模型类上的管理器: ** 模型类.objects ** (1)常用一般查询 rs = Student.objects.all() # 查询所有记录,返回Queryset print(rs ...

  9. django模型层之多表关系

    一. 多表操作 数据库表关系之关联字段与外键约束 一对多 book(多) publish(一) 查询<<水浒传>>这本书出版社的地址: select publish_id fr ...

随机推荐

  1. hadoop 单机模式 伪分布式 完全分布式区别

    1.单机(非分布式)模式 这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统,一般仅用于本地MR程序的调试 2.伪分布式运行模式 这种模式也是在一台单机上运行,但用不同的 ...

  2. [cf1038E][欧拉路]

    http://codeforces.com/contest/1038/problem/E E. Maximum Matching time limit per test 2 seconds memor ...

  3. Cache架构设计

    Cache策略 定时过期策略 定时过期的好处是Cache节点的个数符合实际需求,不会造成资源滥用和服务器压力 定时过期适合访问量较大,实时性要求不高的情况 如果访问量小,定时过期会造成Cache命中率 ...

  4. html走马灯效果

    实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示: ...

  5. Python数据存储:pickle模块的使用讲解

    在机器学习中,我们常常需要把训练好的模型存储起来,这样在进行决策时直接将模型读出,而不需要重新训练模型,这样就大大节约了时间.Python提供的pickle模块就很好地解决了这个问题,它可以序列化对象 ...

  6. 一、Ansible安装

    1:安装ansible ,选择的是yum 安装,简单,ansible的管理端必须是Linux系统       YUM是一个shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下载RPM ...

  7. varchar字数

    每行数据最多65000字节 长度是当前字符集的字符长度,而不是字节长度! 参考:https://www.cnblogs.com/billyxp/p/3548540.html 经常变化的字段用varch ...

  8. mysql查询中AND与OR注意事项

    在查询的where条件中,and要优于or 如果要改变优先级, 需要在最小逻辑判断的条件外加括号(),例如: select * from `table_name` where (`type` = 1 ...

  9. centos7.4 64位安装 google-chrome 与 chromedriver 运行 Python selenium 项目

    centos7.4 实例 利用 yum 命令安装 google-chrome 超级简单(安装最新版): yum install https://dl.google.com/linux/direct/g ...

  10. FPGA 关于中间环节生成时钟的约束---Generated clocks

    FPGA 关于中间环节生成时钟的约束---Generated clocks FPGA 的生成时钟,有一个主时钟源,在定义的之后,需要指明主时钟源. 生成时钟主要定义的是:分频,倍频,相移等 二分频时钟 ...