django models表关系

 *** 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)

 



posted on 2019-03-04 09:39  卓达  阅读(189)  评论(0编辑  收藏  举报

导航