表关系的创建
-OneToOne
- 外键关联
- 字段:关联字段OneToOneField
- on_delete=models.CASCADE) 级联操作 Student_user中元素删除StudentDettail 也删除
class StudentDettail(models.Model): num = models.CharField(max_length=20,default='') college = models.CharField(max_length=20,default='') #外键 student= models.OneToOneField(Student_User,on_delete=models.CASCADE)
-OneToMany
- 在’Many‘位的表中加上一个外键
- on_delete=models.SET_DEFAULT,null=True 删除联级不删除下级,并允许有null
grade=models.ForeignKey('Grade',on_delete=models.SET_DEFAULT,null=True) class Grade(models.Model): name=models.CharField(max_length=20) num = models.CharField(max_length=20)
-ManyToMany
中间表(详见下文)
关联表的数据操作
-OneToMany
-正向
外键 定义在模型1中直接通过模型1来控制外键(指向模型2)的操作被称为正向
- 增 直接赋值
- 删 需要有 允许为空 将其赋值为Nonel 例s.grade=None (s是这个模型内的一个元素)
- 改 直接赋值
- 查 直接查 (调用外键关联表的字段时用双下划线)例(Student_User.object.filter(grade__name='xx'))
通过双下划线来实现两表之间的相互操作
-反向
模型2被模型1所外键关联,那么通过模型2去操作模型1被称为反向
通过外键关联返回的关联模型的管理器(‘模型的小写名’+‘_set’)
- 增 使用管理器直接赋值(all()方法的只能查到与当前模型元素关联的关联模型元素)
- 删 元素.反向管理器.clear() 或者 .remove(响应元素)
- 改 反向无法更改(比如方向改关联元素-又会影响到反向管理器)
- 查 通过反向管理器直接查()
通过反向管理器来实现两表之间的相互操作
-MnayToMany
在指定了中间表时 add,remove,set 都不能用,必须用中间表
-正向
先获取到中间表在正向调用
-反向
同正向
from django.db import models # Create your models here. class Student_User(models.Model): name = models.CharField(max_length=30) #字符串 age =models.SmallIntegerField(default=18) #数字 默认值 sex= models.SmallIntegerField(default=1) qq=models.CharField(max_length=20,null=True,unique=True)#字符串比int好操作 phone=models.CharField(max_length=20,null=True,unique=True) c_time=models.DateTimeField(verbose_name='创建时间',auto_now_add=True) #提示给人看的 e_time=models.DateTimeField(verbose_name='编辑时间',auto_now=True) #提示给人看的 grade=models.ForeignKey('Grade',on_delete=models.SET_NULL,null=True) def __str__(self): return '%s-%s'%(self.name,self.age) class StudentDetail(models.Model): num = models.CharField(max_length=20,default='') college = models.CharField(max_length=20,default='') student= models.OneToOneField('Student_User',on_delete=models.CASCADE) class Grade(models.Model): name=models.CharField(max_length=20) num = models.CharField(max_length=20) def __str__(self): return '%s-%s' % (self.name, self.num) class Course(models.Model): name=models.CharField('课程',max_length=20) students=models.ManyToManyField('Student_User',through='Enroll') def __str__(self): return self.name class Enroll(models.Model): student=models.ForeignKey('Student_User',on_delete=models.CASCADE) course =models.ForeignKey('Course',on_delete=models.CASCADE) pay = models.FloatField('缴费金额',default=0) c_time = models.DateTimeField('报名时间',auto_now_add=True)