django数据库之建表
首先了解几个知识:
什么是一对多,多对多,一对一
什么是关联查询
什么是主表,什么是从表
外键放的位置
正向查询,反向查询
各种设计模式下,怎么查询
一对多:
班级表和学生表
一个班级可以有多个学生,一个学生属于那个班级
一对一:
学生表和学生信息表
每个学生对应各自的学生信息
多对多:
学生表和课程表
一个学生可以选多门课程,一个课程可以别多个学生选
关联查询:
查询数据需要牵扯多个表,需要从多个表中提取字段数据
种类:
内连接
外链接
交叉拦截(笛卡尔积)
主表:
表中主键可以作为另一个表的外键关联的表叫做主表
从表:
拥有此外键的表
一对一关系中外键放的位置:(学生和学生信息表)
放那个表都行,只不过就是主从表的区别
放在A表,B表就是主表
class Student(models.Model):
id = models.AutoField(primary_key=True)
sname = models.CharField(max_length=32)
# 一对一
detail = models.OneToOneField("StudentDetail", to_field="id")
# 等同于如下的代码
# detail = models.ForeignKey(to="StudentDetail",to_field="id",unique=True)
class StudentDetail(models.Model):
id = models.AutoField(primary_key=True)
height = models.PositiveIntegerField()
email = models.EmailField()
memo = models.CharField(max_length=128)
一对多关系中外键放的位置:(学生和班级表)
外键放在多的那一方
class Class(models.Model):
id = models.AutoField(primary_key=True)
cname = models.CharField(max_length=32)
cdata = models.DateField()
class Student(models.Model):
id = models.AutoField(primary_key=True)
sname = models.CharField(max_length=32)
# 一对多
# cid = models.ForeignKey(to="Class",to_field="id",related_name="student")
cid = models.ForeignKey(to="Class", to_field="id")
多对多关系中外键放的位置:(老师和班级表)
多对多有多种设计方法:
1:(放一个中间表)
class Teacher(models.Model):
id = models.AutoField(primary_key=True)
tname = models.CharField(max_length=32)
class Class(models.Model):
id = models.AutoField(primary_key=True)
cname = models.CharField(max_length=32)
cdata = models.DateField()
class Teacher2Class(models.Model):m
id = models.AutoField(primary_key=True)
tid = models.ForeignKey(to="Teacher",to_field="id")
cid = models.ForeignKey(to="Class",to_field="id")
2:(两个表)
class Class(models.Model):
id = models.AutoField(primary_key=True)
cname = models.CharField(max_length=32)
cdata = models.DateField()
class Teacher(models.Model):
id = models.AutoField(primary_key=True)
tname = models.CharField(max_length=32)
cid = models.ManyToManyField(to="Class",name="teacher")
正向查询:
由主表查从表
反向查询:
由从表查主表
关联查询:(一对多模式)
由一到多的语法:
一对应的模型类对象.多对应的模型类名小写__set
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()
由多到一的语法:
多对应模型列对象.多对应的模型类中的关系类属性名
h = HeroInfo.objects.get(id=1)
h.hbook
多对多模式查询:
https://www.cnblogs.com/xiongfanyong/p/13022332.html
我是清茶!欢迎你和我一起讨论,我们下期见