一对一OneToOneField 用户和用户信息
搭建
# 一对一
class TestUser(models.Model):
username=models.CharField(max_length=32)
password = models.CharField(max_length=32)class TestInfo(models.Model):
mick_name=models.CharField(max_length=32)
user=models.OneToOneField(to=TestUser,on_delete=models.CASCADE()#on_delete 删除的模式 CASCADE 级联删除
让后执行数据库迁移命令
同步数据库
1再执行python manage.py makemigrations
2再执行python manage.py migrate
插入用户
python .\manage.py shell
from user.models import TestUser,TestInfo
u=TestUser()
u.username="张三"
u.password="123"
u.save()
查询数据库刷新稍等 数据库插入完成
插入用户详情
ui.mick_name="阿三"
ui.user=u
ui.save()
注意 数据库中有延迟 刷新数据库查看
注意 :nick_name 这里笔者创建为了mick_name
查询用户的详情 查询详情的用户名
有一对一字段就用字段查询 没有字段使用表名查询
#通过用户查询用户信息
>>> u=TestUser.objects.get(id=1)
>>> u.username
'张三'
>>> u.testinfo #注意这里要小写为数据库中 数据库表名
<TestInfo: TestInfo object (1)>>>> u.testinfo.mick_name
'阿三'#通过用户信息查询用户名称
>>> ui=TestInfo.objects.get(id=1)
>>> ui.user.username
'张三'
一对多ForeignKey 学生和教室
搭建
class ClassRoom(models.Model):r_number=models.CharField(max_length=32)#教室门牌号# ForeignKey外键 class Student(models.Model):s_name=models.CharField(max_length=32)s_room=models.ForeignKey(to=ClassRoom,on_delete=models.CASCADE())#外键字段
同步数据库
1再执行python manage.py makemigrations
2再执行python manage.py migrate
插入教室 插入学员
#进入命令行终端
python .\manage.py shell
>>> from user.models import Student,ClassRoom
#插入教室
>>> c=ClassRoom()
>>> c.r_number="1-2048"
>>> c.save()#插入学员小明
>>> s=Student()
>>> s.s_name="小明"
>>> s.s_room=c
>>> s.save()#插入学员小红
>>> s=Student()
>>> s.s_name="小红"
>>> s.s_room=c
>>> c.save()
>>> s.save()#插入 二号教室 新增小花 将小花插入到二号教室
>>> c=ClassRoom()
>>> c.r_number="1-2046"
>>> c.save#查询到1号教室和2号教室
>>> c=ClassRoom.objects.get(id=1)
>>> c1=ClassRoom.objects.get(id=2)
>>> s=Student()
>>> s.s_name="小花"
>>> s.s_room=c1
>>> s.save()
查询教室里所有的学员
有外键字段用外键字段 没有外键字段 表名小写_set
>>> c=ClassRoom()
>>> c.student_set.all()
<QuerySet [<Student: Student object (1)>, <Student: Student object (2)>]>#查询第一个用户 通过用户所在的教室查询用户所在教室编号
>>> s=Student.objects.get(id=1)
>>> s.s_room
<ClassRoom: ClassRoom object (1)>
>>> s.s_room.r_number
'1-2048'
student(学员表名小写)_set构成一表查询多表
查询学员对应的教室
多对多 ManyToManyField老师和教室 中间会有一个及链表
搭建
# 多对多# 班级 class ClassLevel(models.Model):c_name=models.CharField(max_length=32)# 老师 class Teacher(models.Model):t_name=models.CharField(max_length=32)t_class=models.ManyToManyField(to=ClassLevel)
同步数据库
1再执行python manage.py makemigrations
2再执行python manage.py migrate
添加班级 添加老师
#添加班级
>>> from user.models import ClassLevel
>>> from user.models import Teacher
>>> c=ClassLevel()
>>> c.c_name="python_0831"
>>> c.save()
#添加老师老边
>>>t=Teacher()
>>>t.t_name="老边"
>>> t.save()
#将老师加入到班级python_0831
>>> t.t_class.add(c)
>>> t.save()#添加老师龙文
>>> t=Teacher()
>>> t.t_name="龙文"
>>> t.save()#将老师加入到班级python_0831
>>> t.t_class.add(c)
>>> t.save()
班级表
教室表
中间及链表
查询班级所有的认课老师
#查询第一个班级
>>> c=ClassLevel.objects.get(id=1)
>>> c
<ClassLevel: ClassLevel object (1)>#获取班级人数
>>> c.teacher_set.all()
<QuerySet [<Teacher: Teacher object (1)>, <Teacher: Teacher object (2)>]>#通过所有班级对象 循环遍历出老师姓名
>>> [t.t_name for t in c.teacher_set.all()]
['老边', '龙文']
查询老师带过的班级
>>> t=Teacher.objects.get(id=1)
>>> t.t_class.all()
<QuerySet [<ClassLevel: ClassLevel object (1)>]>
>>>