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

>>>

相关推荐
途途途途9 分钟前
精选9个自动化任务的Python脚本精选
数据库·python·自动化
蓝染然28 分钟前
jax踩坑指南——人类早期驯服jax实录
python
许野平35 分钟前
Rust: enum 和 i32 的区别和互换
python·算法·rust·enum·i32
问道飞鱼35 分钟前
【Python知识】Python进阶-什么是装饰器?
开发语言·python·装饰器
追逐时光者40 分钟前
.NET 在 Visual Studio 中的高效编程技巧集
后端·.net·visual studio
大梦百万秋1 小时前
Spring Boot实战:构建一个简单的RESTful API
spring boot·后端·restful
AI视觉网奇1 小时前
Detected at node ‘truediv‘ defined at (most recent call last): Node: ‘truediv‘
人工智能·python·tensorflow
GuYue.bing2 小时前
网络下载ts流媒体
开发语言·python
斌斌_____2 小时前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
牛顿喜欢吃苹果2 小时前
linux创建虚拟串口
python