ORM表关系及操作
本单元的重点
1.多对一
2.一对一
3.关联表 正反查询
1多对一的 案例
class Info(models.Model):
user = models.ForeignKey(other_model,on_delete=models.SET_NULL)
在视图中填写的
from django.db import models
# id name gender 定义老师的模型类
class Teacher(models.Model):
name = models.CharField(max_length=30,verbose_name="老师姓名")
gender = models.CharField(max_length=10,verbose_name="老师性别")
class Meta:
db_table = "teachers"
def __str__(self):
return self.name
# id name gender score teacher_id
class Student(models.Model):
name = models.CharField(max_length=20,verbose_name="学生姓名")
gender = models.CharField(max_length=10,verbose_name="学生性别")
score = models.IntegerField(verbose_name="学生分数")
# to:后边写所关联的模型类
# on_delete=models.CASCADE:主表中数据删除,从表也删除
# 外键关联的是整个模型类,不是单独的某一个对象
# 但是通过模型类会产生一个相关联的字段 字段名_id
teacher = models.ForeignKey(to=Teacher,on_delete=models.CASCADE,verbose_name="所属老师")
class Meta:
db_table = "students"
def __str__(self):
return self.name
1.2多对一的增删改
添加老师语法:
模型类.objects.create()
Teacher.objects.create(name="王老师",gender="女")
删除老师语法:
模型类.objects.get(条件).delete()
# 删除id为2的老师
Teacher.objects.get(id=2).delete() # (3, {'myapp.Student': 2, 'myapp.Teacher': 1}) # 3代表一共删除的数据个数 Student删除3条 Teacher删除1
修改老师语法:
模型类.objects.filter(条件).update()
# 修改id为3的老师性别为女
Teacher.objects.filter(id=3).update(gender="女")
添加学生表i
添加学生语法:
模型类.objects.create()
通过外键_id的形式来添加
Student.objects.create(name="李四",gender="男",score=80,teacher_id=3)
直接给外键赋值一个老师对象
t1 = Teacher.objects.create(name="李老师",gender="男")
Student.objects.create(name="李四",gender="男",score=80,teacher=t1)
删除学生语法:
模型类.objects.get(条件).delete()
Student.objects.get(id=1).delete()
修改学生语法:
模型类.objects.filter(条件).update(字段1,字段2...)
Student.objects.get(id=1).update(name="张三")
1.3多对一的正反查询
# 查询id为2的学生的老师姓名
--找到id为2的学生
stu = Student.objects.get(id=2)
--找到stu对应的老师 stu.teacher.name
stu.外键.name
反向查询:通过django的内置属性来进行查询 模型类(模型类小写)_set()可以反向查询老师名下的所有学生,
# 查询id为1的老师的所有学生 --先找到id为1的老师
tea = Teacher.objects.get(id=1)
--查询tea老师名下的所有学生 老师对象.模型类_set.all()
tea.student_set.all()
2.1一对一的关系
OneToOneField(to, on_delete, parent_link=False, options)
class Teacher(models.Model):
name = models.CharField(max_length=50)
age = models.CharField(max_length=50)
def __str__(self):
return self.name
class Professor(models.Model):
teacher = models.OneToOneField(Teacher,primary_key=True,on_delete=models.CASCADE)
big_project = models.CharField(max_length=50)
def __str__(self):
return self.teacher.name
2.2一对一的增删改
>>> t1 = Teacher.objects.create(name='Jack',age='22')
>>> t2 = Teacher.objects.create(name='Bob',age='17')
>>> p1 = Professor.objects.create(teacher=t1,big_project='雾霾净化术')
>>> p1.teacher
<Teacher: Jack>
>>> p1.teacher = t2
>>> p1.save()
2.3一对一的正向 查询
# 正向查询:通过教授,查询对应的讲师信息
>>> p1.teacher
<Teacher: Bob>
3.4一对一的反向查询
# 反向查询:通过讲师,查询教授信息, 反向查询时,只需要 模型类 本身即可
t1.professor.name
3.1多对多的关系
django.db import models
# 一个乐队可以有很多音乐家,一个音乐家也可以隶属好多个乐队
# 定义音乐家模型类
class Artist(models.Model):
artist_name = models.CharField(max_length=20,verbose_name="音乐家名字")
# 定义元类
class Meta:
db_table = "artist1"
def __str__(self):
return self.artist_name
# 定义乐队模型类
class Band(models.Model):
band_name = models.CharField(max_length=20,verbose_name="乐队名")
# 多对多
artist = models.ManyToManyField(Artist)
# 定义元类
class Meta:
db_table = "band"
def __str__(self):
return self.band_name
3.2多对多关系的未见添加
添加音乐家语法:
模型类.objects.create()
a1 = Artist.objects.create(artist_name="朗朗")
a2 = Artist.objects.create(artist_name="李健")
添加乐队语法:
语法:
b1 = Band.objects.create(band_name="破吉他乐队")
b2 = Band.objects.create(band_name="凯乐乐队")
# b1这个乐队有2个音乐家分别是a1和a2 将a1和a2添加到b1这个乐队里
b1.artist.add(a1,a2)
# b2这个乐队有一个音乐家是a2
b2.artist.add(a2)
3.3多对多的外键移除
# 接触a1和b1的关系 在b1乐队中将a1解除 只是接触乐队和音乐家的关系不是删除数据
b1.artist.remove(a1)
3.4多对多的修改查询
# 通过外键查询该乐队的全部音乐家
# 查看b1乐队的成员
b1.artist.all()
# 查看b2乐队的成员
b2.artist.all()
# 反向查询:通过音乐家,查询该音乐家加入的乐队信息
# 查看a2这个音乐家所属的乐队
a2.band_set.all()