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 \, \>

#查询第一个用户 通过用户所在的教室查询用户所在教室编号

>>> 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 \, \>

#通过所有班级对象 循环遍历出老师姓名

>>> t.t_name for t in c.teacher_set.all()

'老边', '龙文'

查询老师带过的班级

>>> t=Teacher.objects.get(id=1)

>>> t.t_class.all()

<QuerySet \>

>>>

相关推荐
ch85619 分钟前
智能体5-结构化输出
后端
贰先生20 分钟前
Xiuno BBS 重构记录贴(十九)消息通知系统
后端
wulisongsong21 分钟前
双重检验锁的单例模式在高并发下的可见性问题
后端
贰先生22 分钟前
Xiuno BBS 重构记录贴(十八)插件兼容扫描器
后端
神奇小汤圆43 分钟前
阿里面试官:什么才是可工程化落地的RAG项目
后端
ZPYZTech1 小时前
用 Wails + Go + Vue3 开发桌面软件,聊聊踩过的坑
后端
张高兴1 小时前
张高兴的 Hailo-10 开发指南:(二)使用 LangChain 搭建本地大模型 RAG 问答应用
python·边缘计算·hailo
财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月6日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
Land03292 小时前
Python + RPA 双引擎实战:从手写脚本到可交付自动化应用的完整链路
python·自动化·rpa
好家伙VCC2 小时前
区块链双向支付通道实战:从签名到结算
java·后端·区块链·asp.net