17-2 orm单表操作和多表操作
参考:https://www.cnblogs.com/liwenzhou/p/8660826.html
一 ORM单表操作
1 增删改查
- 1. 查询
- 1. 查所有
- models.Publisher.objects.all()
- 2. 查某个具体的记录
- models.Publisher.objects.get(id=1) --> 注意查询条件不成立就报错
- 2. 删除一条记录
- models.Publisher.objects.get(id=1).delete()
- 3. 创建一条记录
- models.Publisher.objects.create(name="新出版社名字", addr="出版社地址")
- 4. 修改一条记录
- obj = models.Publisher.objects.get(id=1)
- obj.name = "新名字"
- obj.save()
2 字段和参数:
--1. 字段
1. CharField 字符类型,必须提供max_length
2. AutoField int自增
3. DateField 日期字段
4. DateTimeField() 日期时间字段
5. IntergeField() 整数类型
--2. 参数
1. null=True 可以为空
2. default=默认值
3. unique=True 表示是唯一的
--4. 时间字段
1. auto_now_add=True 创建数据记录的时候会把当前时间添加到数据库
2. auto_add=True 每次更新数据记录的时候会更新该字段。
3 ORM必知必会单表查询13条:
- 1. all() --> 查询所有结果
- 2. filter() --> 根据查询条件查询数据库的
- 3. get() --> 获取一个唯一的值
- 4. exclude() --> 将符合条件的都剔除掉,留下不符合条件的
- 5. values('字段名', ...) --> 返回一个QuerySet,里面是字典
- 6. values_list(字段名', ...) --> 返回一个QuerySet,里面是元祖
- 7. order_by() --> 对查询结果排序
- 8. reverse() --> 对一个有序的查询结果集做反转
- 9. distinct() --> 去重,跨表查询时去掉重复的记录,MySQL不支持按字段去重
- 10. count() --> 返回数据条数
- 11. first() --> 取第一个数据
- 12. last() --> 取最后一条数据
- 13. exists() --> 判断表里有没有数据
分类:
1. 返回QuerySet列表的有哪一些?
1. all()
2. filter()
3. exclude()
4. order_by()
5. reverse()
6. distinct()
7. values('字段名', ...) --> 查询结果的列表里,都是字典
8. values_list(字段名', ...) --> 查询结果的列表里,都是元祖
2. 返回具体对象的
1. first()
2. last()
3. get()
3. 返回数字的
1. count()
4. 返回布尔值
1. exists()
4 单表查询双下划线操作
例子:
- models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
- models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
- models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
- models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的
- models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
- models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and
- 类似的还有:startswith,istartswith, endswith, iendswith
- date字段还可以:
- models.Class.objects.filter(first_day__year=2017)
5 如何在一个py文件中 使用Django项目的相关配置或内容,比如之间连接djanjo里面的数据库,在新建的py文件里面写上下面这个即可:
- import os
- if __name__ == '__main__':
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
- import django
- django.setup()
- from app01 import models
二 ORM跨表操作
1 外键 ForeignKey
通过Foreignkey字段 ,能够得到和我关联的那个对象
数据库中保存的字段名是 外键字段_id
例子:书名关联出版社
- class Book(models.Model):
- title = models.CharField(max_length=32)
- publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE)
- on_delete=models.CASCADE的意思是当主表删除数据之后,从表也跟着删除
2 外键增删改查操作
详情见练习和作业
3 跨表查询:
正向查询:
- # 查询第一本书关联的出版社的名字
- # 1. 基于对象的查询
- # book_obj = models.Book.objects.first()
- # ret = book_obj.publisher.name
- # print(ret)
- # 2. 基于queryset的双下划线查询,双下划线表示跨表
- # ret = models.Book.objects.all().values_list("publisher__name").distinct()
- # print(ret)
# 反向查询
- # 由出版社反向查找书籍
- publisher_obj=models.Publisher.objects.get(id=2)
- books=publisher_obj.book_set.all()
- title=books.values_list("title","id")
- print(title)
- # 2. 基于queryset的双下划线
- # 江出版社出版的所有书籍的书名
- ret = models.Publisher.objects.filter(id=2).values_list("book__title","book__id")
- print(ret)
17-2 orm单表操作和多表操作的更多相关文章
- Django框架05 /orm单表操作
Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...
- orm单表操作
二.orm简介 ORM:object relation mapping (ORM是“对象-关系-映射”的简称) MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦, ...
- day59——orm单表操作
day59 orm单表操作 对象关系映射(object relational mapping) orm语句 -- sql -- 调用pymysql客户端发送sql -- mysql服务端接收到指令并执 ...
- django框架基础-ORM单表操作-长期维护
############### 单表操作-添加数据 ################ import os if __name__ == '__main__': os.environ.set ...
- day52:django:ORM单表/多表操作
目录 1.ORM 2.ORM单表增删改查 13个必知必会的查询接口 filter基于双下划线的模糊查询 3.ORM多表增删改查 ORM 什么是ORM? ORM(object relational ma ...
- Django学习笔记(7)——单表操作和多表操作
单表操作 1,创建模型 创建名为book的APP,在book下的models.py中创建模型: from django.db import models # Create your models he ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- ORM单表查询,跨表查询,分组查询
ORM单表查询,跨表查询,分组查询 单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
随机推荐
- [LOJ2114][HNOI2015]-菜肴制作-拓扑排序+贪心
<题面> 一个蒟蒻的痛苦一天 在今天的节目集训中,麦蒙将带领大家学习9种错误的解题策略 $15\%$算法(看两个就往下走吧) 1> puts("Impossible!&qu ...
- Cesium 1.50重量级新功能测评
概要 既Cesium 1.49中3dtile加载性能大幅提升以后,Cesium 1.50再次迎来几个重量级新功能: 1 地球裁切,这下相当于可以截取一部分地形影像数据,当作一个平面场景来用了! 2 射 ...
- OSI层次关系
一.OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型. 1.OSI的来源 OSI(Open System Interconnect),即开 ...
- 洛谷P1470 最长前缀
P1470 最长前缀 Longest Prefix 题目描述 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 ...
- Leetcode34.Find First and Last Position of Element in Sorted Array在排序数组中查找元素的位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- JavaScript 中的多线程通信的方法
在Html 5诞生之后,我们可以使用javascript来实现多线程处理.H5 新增了一个web workers api,使用这个API,用户可以很容易地创建在后台运行的线程,H5 中被称为workd ...
- tp5.1 本地正常, 线上route.php不起作用的问题
由于本项目 的.htaccess文件是放在根目录的, 上传没有覆盖,重新编辑 <IfModule mod_rewrite.c> Options +FollowSymlinks -Multi ...
- 问题解决:listview多次调用addHeaderView和addFooterView
情景: 有两个分类,每个分类下的数据用listview显示,分类1需要显示头视图和尾视图,分类2不要显示头视图和尾视图 .两个分类可以来回切换. 实现的步骤: 1. addHeaderView . a ...
- Laravel 精选资源大全
原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts 新闻:Laravel News 中文文档 Laravel学院– Laravel 5. ...
- python实现六大分群质量评估指标(兰德系数、互信息、轮廓系数)
python实现六大分群质量评估指标(兰德系数.互信息.轮廓系数) 1 R语言中的分群质量--轮廓系数 因为先前惯用R语言,那么来看看R语言中的分群质量评估,节选自笔记︱多种常见聚类模型以及分群质量评 ...