一对一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)>]>
>>>