django原生sql
参考:http://www.jb51.net/article/128257.htm
coding=utf-8
from django.core.paginator import Paginator
def paginator(data_list, per_page, page_no):
"""封装Django分页"""
pages = Paginator(data_list, per_page)
# 防止超出页数
if not page_no > 0:
page_no = 1
if page_no > pages.num_pages:
page_no = pages.num_pages
p = pages.page(page_no) # 获取本页数据
data = dict() # 获取分页信息
data['count'] = pages.count
data['page_num'] = pages.num_pages
data['per_page'] = per_page
data['current'] = page_no
data['start_index'] = p.start_index() - 1
return p.object_list, page_no, data
class QueryWrapper(object):
"""查询集包装器。实现django Paginator需要的必要方法,实现和query一样使用Paginator分页"""
def init(self, sql, params=None, db="default"):
"""
:param sql: sql语句
:param params: sql语句的params参数
:param db: 数据库名称(Django配置)
"""
self.db = db
self.sql = sql
self.params = params
def count(self):
"""计算总页数"""
sql = """select count(*) from (%s) _count""" % self.sql
# sql封装方法请参考https://my.oschina.net/watcher/blog/1573503
return fetchone_sql((sql, self.params), db=self.db, flat=True) # 返回总页数
def getslice(self, x, y):
""" self.__getslice(x, y) = self[x:y]"""
sql = self.sql + ' LIMIT {start}, {num}'.format(start=x, num=y - x)
# sql封装方法请参考https://my.oschina.net/watcher/blog/1573503
return fetchall_to_dict((sql, self.params), db=self.db) # 字典列表形式返回
def demo_orm():
"""使用Django的ORM分页"""
# 示例:查询status=1的用户分页,每页10条,取第2页数据(假设数据量足够)
status = 1
per_page = 10
page_no = 2
# 使用Django的ORM
from django.contrib.auth.models import User
query = User.objects.filter(status=status).values("id", "username", "first_name")
one_page_data_list, page_no, page_data = paginator(query, per_page, page_no)
# one_page_data_list 即为第二页数据,例如:[{"id": 1, "username": "111", "first_name": "aaa"}]
print one_page_data_list
def demo_raw():
"""使用原生sql实现相同分页"""
# 示例:查询status=1的用户分页,每页10条,取第2页数据(假设数据量足够)
status = 1
per_page = 10
page_no = 2
sql = "select id, username, first_name from auth_user where status=%(status)s"
params = {"status": status} # 使用params防止sql注入
query = QueryWrapper(sql, params, "default")
one_page_data_list, page_no, page_data = paginator(query, per_page, page_no)
# one_page_data_list 同ORM获取数据一样
print one_page_data_list
if name == "main":
demo_orm()
demo_raw()
django原生sql的更多相关文章
- django原生sql查询如何返回字典格式
django原生sql查询,默认返回的是元祖.如果想返回字典格式,需要自行封装: http://www.360doc.com/content/17/0802/11/9200790_676042880. ...
- 18.Django原生SQL语句查询返回字典
在django中执行自定义语句的时候,返回的结果是一个tuple ,并我不是我所期望的dict.当结果是tuple 时,如果要取得数据,必须知道对应数据在结果集中的序号,用序号的方式去得到值. 如果是 ...
- django -----原生SQL语句查询与前端数据传递?
view.py中 import MySQL def request_data(request): if request.method == "GET": conn = MySQLd ...
- django中使用原生sql
在Django中使用原生Sql主要有以下几种方式: 一:extra:结果集修改器,一种提供额外查询参数的机制 二:raw:执行原始sql并返回模型实例 三:直接执行自定义Sql ( 这种方式完全不依赖 ...
- Django ORM 使用原生 SQL
使用原生sql的 方法 : raw # row方法:(掺杂着原生sql和orm来执行的操作) res = CookBook.objects.raw('select id as nid from epo ...
- Django中的ORM相关操作:F查询,Q查询,事物,ORM执行原生SQL
一 F查询与Q查询: 1 . F查询: 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的 ...
- Django中使用mysql数据库并使用原生sql语句操作
Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件mysql数据库,版本5.7 ...
- django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境
ORM执行原生sql语句 在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询. Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回 ...
- Django进阶Model篇008 - 使用原生sql
注意:使用原生sql的方式主要目的是解决一些很复杂的sql不能用ORM的方式写出的问题. 一.extra:结果集修改器-一种提供额外查询参数的机制 二.执行原始sql并返回模型实例 三.直接执行自定义 ...
随机推荐
- 基于阿里云服务器Linux系统部署JavaWeb项目
前段时间刚完成一个JavaWeb项目,想着怎么部署到服务器上,边学边做,花了点时间终于成功部署了,这里总结记录一下过程中所遇到的问题及解决方法.之所以选择阿里云,考虑到它是使用用户最多也是最广泛的云服 ...
- ThinkPHP5作业管理系统中处理学生未交作业与已交作业信息
在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业.那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student).班级(class).作业提 ...
- nvm版本管理工具安装
windows 安装nvm步骤(shi'yongnvm-windows管理node版本): 瞎几把前言:mac上可以用n来管理node版本,私以为n很好用.家里的win7台式机一直没有安装过任何管理工 ...
- SPOJ 375 Query on a tree(树链剖分)(QTREE)
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...
- 软件工程项目组Z.XML会议记录 2013/11/20
软件工程项目组Z.XML会议记录 [例会时间]2013年11月20日星期三21:00-22:00 [例会形式]小组讨论 [例会地点]学生公寓3号楼会客厅 [例会主持]李孟 [会议记录]李孟 会议整体流 ...
- 【转】webpack4
1.不再支持node.js4.X 2.不能用webpack命令直接打包指定的文件,只能使用webpack.config.js进行配置. 即:webpack demo01.js bundle01.j ...
- Mac上基于hexo+GitHub搭建个人博客(一)
原文地址: http://fanjiajia.cn/2018/11/23/Mac%E4%B8%8A%E5%9F%BA%E4%BA%8Ehexo+GitHub%E6%90%AD%E5%BB%BA%E4% ...
- 【Linux】- ls命令详解
1 命令功能: 列出当前目录下或者指定目录下的所有文件和目录,ls是list的缩写. 2 命令语法: ls [选项] [目录名] #注:[]中的内容为非必选项 3 命令选项: -a 列出目录下 ...
- BZOJ4456 ZJOI2016旅行者(分治+最短路)
感觉比较套路,每次在长边中轴线处切一刀,求出切割线上的点对矩形内所有点的单源最短路径,以此更新每个询问,递归处理更小的矩形.因为若起点终点跨过中轴线是肯定要经过的,而不跨过中轴线的则可以选择是否经过中 ...
- Luogu2737 USACO4.1麦香牛块(动态规划)
小凯的疑惑升级版.只有两个数的话不能表示的最大数是ab-a-b,显然如果可选数增加不会比这更大,所以只要答案存在一定小于256*256-2*256.在这个范围内背包即可. #include<io ...