IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Django中的关系映射 -> 正文阅读

[Python知识库]Django中的关系映射


Django中的关系映射

导言

学习Django的ORM需要掌握三个维度

  • 如何建表
  • 如何建立数据
  • 如何对数据进行查询

一对一

一个人对应一个身份证

语法 OneToOneField

class People(models.Model):
	...
class Sfz(models.Model):
	ren = models.OneToOneField(People,on_delete=models.CASCADE)	#级联删除
  • on_delete
  1. models.CASCADE 【级联删除,包括ForeignKey的对象】
  2. models.PROTECT 【阻止删除】
  3. SET_NULL 【设置ForeignKey null,需提前指定null=True,即可以删除,删除后外键为空】

创建

  • 无外键->人
people1 =People.objects.create(...)
  • 有外键->身份证
sfz1 = Sfz.objects.create(...,[people_id=1]|[people=people1])

查询

  • 正向查询:直接通过外键属性查询
from .models import people
sfz1 = Sfz.objects.get(id='sfz1'# 查找people1的身份证id
sfz1.people.name
  • 反向查询:没有外键属性的一方,可以通过反向属性查询到关联的另一方
    !!反向引用不存在时会触发异常
people1 = people.objects.get(name='people1'# 查找人1的身份证id
people1.Sfz.id

一对多

一个班级对应多个学生
原则上是在多这一端的表上设置外键

语法 ForeignKey

class Student(models.Model):
	classroom = models.ForeignKey(Classroom,on_delete=models.CASCADE)	#级联删除
class Classroom(models.Model):
	...

创建

  • 先创建一,后创建多
classroom = Classroom.objects.create(name="1班")
student1 = Student.objects.create(name="zhangsan",classroom=classroom)
or
student1 = Student.objects.create(name="zhangsan",classroom_id=1)

查询

  • 正向查询
classroom = Classroom.objects.get(name="1班")
student1 = Student.objects.get(name="zhangsan",classroom=classroom)
or
student1 = Student.objects.get(name="zhangsan",classroom_id=1)
  • 反向查询
classroom1 = Classroom.objects.get(name="1班")
students = classroom1.student_set.all()
for student in students:
	print(student.name)

多对多

一个学生对应多门课程,一个课程对应多名学生

语法ManyToManyField

  • 无需创建第三张表,Django自动完成
class Student(models.Model):
	name = models.CharField('name')
class Course(models.Model):
	coursename = models.CharField('coursename')
	student = models.ManyToManyField(Student)

创建

  • 先创建student再关联Course

student1和student2同时参加了course1

student1 = Student.objects.create(name="zhangsan")
student2 = Student.objects.create(name="lisi")
course1 = student1.course_set.create(name="chinese")
student2.course_set.add(course1)
  • 先创建course再关联student

student1和student2同时参加了course1

student2 = Student.objects.create(name="lisi")
course1 = student1.objects.create(name="chinese")
student1 = course1.student.create(name="zhangsan")
course.student.add(student2)

查询

  • 正向查询
student1.course.all()	#获取到学生1选择的所有课程
course1.student.all()	#获取到course1这门课程下的所有学生

student1.course.filter(name='chinese')

  • 反向查询
student1.course_set.all()
course1.student_set.filter()
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:26:58  更:2022-02-26 11:29:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:20:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码