八.常用查询及关系的实现(二) 2021-03-08
八.常用查询及关系的实现(二)
1.示例:一对多 学生与学院
1.1结构设计
通过的外键联系起来两表
1.2建立模型
1.建立学生信息表与学院信息表模型
from django.db import models# Create your models here.
'''
继承自模型类models
模型类和数据库表的关系
属性和表的字段的对应关系'''class Department(models.Model):#学院类d_id = models.AutoField(primary_key=True) # 设置主键以后,不会再自增长了d_name = models.CharField(max_length=20)class Meta:db_table = 'department' # 给一个表名def __str__(self):return self.d_nameclass Student(models.Model):s_id = models.AutoField(primary_key=True)s_name = models.CharField(max_length=30)#ForeignKey在定义时设置 连接的表名 ,related_name 参数来覆盖foo_set 的名称.department = models.ForeignKey('Department',on_delete=models.CASCADE)class Meta:db_table = 'student'def _str_(self):return self.s_name# 'Srudent<s_id = %s , s_name=%s>'%(# self.s_id,self.s_name# )
注意:如果模型I有一个ForeignKey,那么该ForeignKey 所指的模型II实例可以通过一个管理器回前面有ForeignKey的模型I的所有实例。默认情况下,这个管理器的名字为foo_set,其中foo 是源模型的小写名称。在定义时设置related_name 参数来覆盖foo_set 的名称.
1.3 将模型映射到数据库
1.首先执行以下命令,要创建映射文件
python manage.py makemigrations
命令后面可以跟app名称,表示指定对某个app的模型进行映射,没写所有的app都执行.
2.执行以下命令,将映射文件中的映射数据提交到数据库中
python manage.py migrate
3.进入mysql 查看映射的数据库表
- mysql -uroot -pqwe123 进入mysql
- show databases; 查看所有的数据库
- use look; 使用数据库
- show tables 查看数据库
打开数据我们能看到创建的以app名_模型名的数据表,而其他的一些表格是django自动生成的.
注意:如果要删除表,那么可以去django模型中注释掉模型类,然后执行映射的命令,不要手动在命令行里面去删除.
在执行前,保证我们创建模型的APP是已经注册过的APP
注意:在运行之前一定要将PyCharm的程序上传到虚拟机,不然会报一下错误
pymysql.err.OperationalError: (1046, 'No database selected')
django.db.utils.OperationalError: (1046, 'No database selected')
执行过程:
- workon 查看虚拟环境
- workon name 运行虚拟环境
- ls 查看目录下的文件
- cd 项目文件 进入文件
- python manage.py makemigrations 创建映射文件
- python manage.py migrate 映射文件中的映射数据提交到数据库中
- show tables 查看建立的表
1.查看所有数据库 |
2.使用数据库,查看库里的所有表 |
3.查看学院表数据结构 |
4.查看学生表数据结构 |
1.4添加数据
1.在子应用的views中导入models.py文件,写显示函数
from django.shortcuts import renderfrom django.http import HttpResponse
from .models import Department,Student #导入建立的模型
# Create your views here.def add_Department_Student(request):#向学院表与学生表添加信息#添加学院信息d1 = Department(d_id = 1 ,d_name = '文学院')d1.save()d2 = Department(d_id = 2, d_name = '计算机技术')d2.save()#添加学生信息#方法1 :.第一种方式就是跟之前的一样,用传参的方法添加,需要注意的是外键的值必须是关联表中已经存在的值.s1 = Student(s_id = 1 , s_name = '忘记',department_id = 2)s1.save()#方法2 :用的属性赋值的方式,因为我们在模型类有定义了一个department的属性,而这个属性的对象的类型必须是department表的类实例对象s2 = Student(s_id = 2 ,s_name = '坚强')s2.department = d2s2.save()s3 = Student(s_id = 3 , s_name = '嘿你好',department_id = 1)s3.save()return HttpResponse('插入成功')
2.设置子路由的url
from django.urls import path,re_path
from .import viewsurlpatterns = [#添加学生与学院信息path('add_Department_Student',views.add_Department_Student ,name = 'add_Department_Student'),
]
3.运行结果:
4.在虚拟机的Mysql中查询新建的表
1.5表关联对象的访问
1.在子应用的views中导入models.py文件,写显示函数
from django.shortcuts import renderfrom django.http import HttpResponse
from .models import User,BookInfo,Department,Student #导入建立的模型
# Create your views here.def test_Info_Department_Student(request):s1 = Student.objects.get(s_id=1) #给学生一个实例对象d1 = Department.objects.get(d_id=1) #给学院一个实例对象print(d1.student_set) #反向的时候是一种管理器,里面包含了方法print(d1.student_set.all()) #.all 拿到该学院学生的所有数据#add()方法 修改数据,无序用seve()保存,自动保存,适用于 一对多,多对多d1.student_set.add(s1) #将学生id为1的学生换到学院id为1# creat()方法 新建数据 一对多,多对多d1.student_set.create(s_name = '张画') #给学院id为1添加学生return HttpResponse('访问成功')
2.设置子路由的url
from django.urls import path,re_path
from .import viewsurlpatterns = [#访问学生与学员信息path('test_Info_Department_Student',views.test_Info_Department_Student ,name = 'test_Info_Department_Student'),
]
3.运行结果:
4.在虚拟机的Mysql中表前后对比
1.6处理关联对象方法
用法同上1.5 (下面是在终端实现的,不过方法是一样的)
1. add(obj1, obj2, ...) 添加的已经存在数据库的数据
添加一指定的模型对象到关联的对象集中。
1.d1.student的管理器有add的方法.
2.例子中的s2能添加成功是因为设置了student表中department字段允许为空了.
2.create(**kwargs) 添加不存在的数据 ,将数据直接存入数据库
创建一个新的对象,将它保存并放在关联的对象集返回新创建的对象
3.remove(obj1, obj2, ...) 从关联的对象集中删除指定的模型对象。
删除的是关系表中的数据的对象集中。
因为我们有修改student表中的department_id字段允许为空,所以当删除的时候这个字段值为NULL.
4.clear() 从关联的对象集中删除所有的对象
注意:注意对于所有类型的关联字段,add()、create()、remove()和clear()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。
2.多对多查询
Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:
# 查询学院名字为‘计算机学院’的学生的信息
Student.objects.filter(department__d_name='计算机学院')
它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。
#查询学生名字中包含 '小' 的学生的学院信息
Department.objects.filter(student__s_name__contains='小')
# 查询学号为1的学生所有的课程
Course.objects.filter(student__s_id=1)
# 查询报了课程1的所有的学生
Student.objects.filter(course__c_id=1)
# 查询报了'python'课程的的学生的所属学院的信息
Department.objects.filter(student__course__c_name='python')
关于多对多表查询的详细信息:查看Django(多表查询操作) - SmllNine - 博客园 (cnblogs.com)
3.查询方法补充
3.1 聚合查询
聚合查询:aggregate()是QuerySet 的一个终止子句,它返回一个包含一些键值对的字典
键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。
3.2分组查询
annotate():为QuerySet中每一个对象都生成一个独立的汇总值。
是对分组完之后的结果进行的聚合
3.3 F查询
Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值
3.4 Q查询
Q查询: 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。
Q对象可以使用&(and)、|(or)操作符组合起来
使用~(not)操作符在Q对象前表示取反
八.常用查询及关系的实现(二) 2021-03-08相关推荐
- Hive _偏门常用查询函数(二)附带实例(列转行、窗口函数)
接上篇博客: Hive _偏门常用查询函数(一)附带实例 https://blog.csdn.net/qq_41946557/article/details/102904642 列转行 1.函数说明 ...
- mongo执行逻辑表达式_MongoDB 常用查询操作
MongoDB 查询操作可实现大部分关系型数据库的常用查询操作,本文对 MongoDB 常用查询进行讲解. 在进行操作讲解前,先展示当前 MongoDB 中已存在的文档,集合名称article 条件大 ...
- as常用固定搭配_MongoDB 常用查询操作
MongoDB 查询操作可实现大部分关系型数据库的常用查询操作,本文对 MongoDB 常用查询进行讲解. 在阅读本文前,推荐先阅读<MongoDB 安装及文档的基本操作> 在进行操作讲解 ...
- MySQL 数据库 之 高级 SQL 语句(常用查询,正则表达式,运算符,库函数,存储过程)
文章目录 前言 一 . 常用查询介绍 1.按关键字排序 1.1默认升序 1.2 降序 1.3 多字段的排序 2. 对结果进行分组 2.1 分组统计 3.限制结果条目 3.1 查看前4行 3.2 查看第 ...
- mongoDB 常用查询
一,mongo mongoDB是一个基于分布式文件存储的数据库,C++编写,旨在为web应用提供可 拓展的高性能存储解决方案,是开源的. mongoDB将数据存储为一个文档,数据结构由key--> ...
- SqlSugar常用查询实例-拉姆达表达式
SqlSugar支持拉姆达表达式查询,匿名对象参数等,相对还是比较方便好用的. 一.查询列表: //查询列表SqlSugarClient db = SugarContext.GetInstance() ...
- python-django-ORM,常用查询方式
介绍django model 的一些常用查询方式 首先是一些文档性的帮助 __exact 精确等于 like 'aaa' __iexact 精确等于 忽略大小写 ilike 'aaa' __conta ...
- mysql筛选字符个数为8的_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)...
一 . 常用查询介绍 1.创建表结构并插入内容 创建一个表 里面有id 毕业院校 家庭住址 name mysql> create table gou(id int primary key,sch ...
- Hive _偏门常用查询函数(三)附带实例(Rank)
接上两篇博客 Hive _偏门常用查询函数(一)附带实例 https://blog.csdn.net/qq_41946557/article/details/102904642 Hive _偏门常用查 ...
最新文章
- ssm过滤器可以只过滤html吗,SSM登陆验证之过滤器实现
- python怎么定义空矩阵_Python创建一个空的稀疏矩阵
- “西邮漫记”--自由照耀中国
- linux中bc用法英文,使用GNU bc在Linux Shell中进行数学运算
- php同时删除两个列表数据库,PHP 处理 数据库多表,既能高效又能思路清晰如何处理的?...
- 不连续曲线 highcharts_什么是正则曲线和正则曲面
- java的System.getProperty()方法可以获取的值
- c++ 高效解析url算法
- ssis组件_使用SSIS Hadoop组件连接到Apache Hive和Apache Pig
- 多个帐户都用root 来登录 怎么看另一个用户使用的那些命令
- 0427千里之行,始于足下
- python填空题及答案知乎_zhihu-python
- C语言知识点——函数参数
- APICloud 实现文档下载和预览功能
- 卖出平仓是什么意思​?
- 微软e5服务器,微软E5 自动订阅程序
- 王川:小米盒子的产品观
- svn查找历史版本_svn历史版本对比以及还原到历史版本
- 第一周python学习
- 计算机是如何组成的?