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

>>>

相关推荐
STLearner8 分钟前
KDD 2026 | (2月轮)时空数据(Spatial-Temporal)论文总结时空【下】(人群移动,城市科学(资源调度,)
大数据·人工智能·python·深度学习·机器学习·语言模型·数据挖掘
云和数据.ChenGuang9 分钟前
python sorted函数详细剖析
开发语言·人工智能·windows·python·1024程序员节
打工仔折腾 AI13 分钟前
AI Agent 工程化实战(二):5 分钟跑通 Deep Agent 并逐层拆解底层链路
java·数据库·人工智能·后端·python·langchain·ai agent 实战
外收内放15 分钟前
FastAPI猜字谜实战(4):让AI主持人开口
开发语言·python·学习·fastapi
云和数据.ChenGuang15 分钟前
Python map() 函数详解:从语法、原理到实战用法
开发语言·人工智能·python·langchain·1024程序员节
2601_9628857234 分钟前
baostock vs Tushare:哪个免费股票数据 API 更好用?
python
hahaha601639 分钟前
数字图像锐化
开发语言·python
xiangjiaodalishi1 小时前
主流 AI 爬虫 User-Agent 清单大全:分组、配置与持续维护(2026 版)
人工智能·爬虫·python
普贤莲花1 小时前
先学Workbuddy还是“人工智能训练师”,或者python基础课?
开发语言·人工智能·python
砚底藏山河1 小时前
python量化实操:回测数据缓存与重放
java·python·金融·1024程序员节