python#django数据库一对一/一对多/多对多

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

>>>

相关推荐
巽星石27 分钟前
【Blender Python】7.一些运算、三角函数以及随机
python·blender·三角函数·随机·环形阵列
CSXB9928 分钟前
一、Python(介绍、环境搭建)
开发语言·python·测试工具·集成测试
九圣残炎31 分钟前
【springboot】简易模块化开发项目整合Redis
spring boot·redis·后端
Mopes__32 分钟前
Python | Leetcode Python题解之第461题汉明距离
python·leetcode·题解
EterNity_TiMe_1 小时前
【机器学习】智驭未来:探索机器学习在食品生产中的革新之路
人工智能·python·机器学习·性能优化·学习方法
.生产的驴1 小时前
Electron Vue框架环境搭建 Vue3环境搭建
java·前端·vue.js·spring boot·后端·electron·ecmascript
爱学的小涛1 小时前
【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解
java·开发语言·笔记·后端·nio
爱学的小涛1 小时前
【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
java·开发语言·笔记·后端·nio
北极无雪1 小时前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring
爱码少年1 小时前
springboot工程中使用tcp协议
spring boot·后端·tcp/ip