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

>>>

相关推荐
kvo7f2JTy1 分钟前
全面解析 Mineru:高效文件解析工具的核心参数详解
python
小江的记录本1 分钟前
【RabbitMQ】RabbitMQ核心知识体系全解(5大核心模块:Exchange类型、消息确认机制、死信队列、延迟队列、镜像队列)
java·前端·分布式·后端·spring·rabbitmq·mvc
心静财富之门2 分钟前
《前端零基础入门:HTML + CSS + JavaScript 全套速查表(详细版 + 实例)》
前端·javascript·python
蜜獾云9 分钟前
Maven项目引入本地JAR包的三种正确方式对比
python·maven·jar
爱睡懒觉的焦糖玛奇朵11 分钟前
【工业级落地算法之打架斗殴检测算法详解】
人工智能·python·深度学习·学习·算法·yolo·计算机视觉
深挖派13 分钟前
PyCharm 2026.1 全版本安装配置与全功能环境搭建 (保姆级图文教程)
ide·python·pycharm
好家伙VCC14 分钟前
**发散创新:基于算子融合的深度学习推理优化实战**在现代AI部署场景
java·人工智能·python·深度学习
Ofm1z1Q9R14 分钟前
python-langchain框架(3-5-pdf文件load_and_split()加载 )
python·langchain·pdf
小江的记录本21 分钟前
【RocketMQ】RocketMQ核心知识体系全解(5大核心模块:架构模型、事务消息两阶段提交、回查机制、延迟消息、顺序消息)
linux·运维·服务器·前端·后端·架构·rocketmq
数据知道22 分钟前
claw-code 源码详细分析:命令宇宙 vs 工具宇宙——`commands` / `tools` 镜像清单如何驱动路由与 shim 执行?
linux·服务器·网络·python·ai·claude code