filter(**kwargs) 包含了与所给筛选条件相匹配的对象
all() 查询所有结果
get(**kwargs) 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都是报错
values(*field) 返回一个ValueQuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
exclude(**kwargs) 包含了与所给的筛选条件不匹配的对象
order by(*field) 对查询结果排序
reverse() 对查询结果反向排序
distinct() 从返回结果中剔除重复记录
values_list(*field) 与values()非常相似,返回一个元组序列,values返回一个字典序列
count() 返回数据库中匹配的记录的数量
first() 返回数据库中匹配的对象的第一个对象
last() 返回数据库中匹配的对象的最后一个对象
exists() 判断一个对象集合中是否包含指定对象,包含返回True,不包含返回False
exclude() 排除满足条件的对象
annotate() 使用聚合函数
dates() 根据日期获取查询集
datetimes() 根据时间获取查询集
none() 创建空的查询集
union() 并集
intersection() 交集
difference() 差集
select_related() 附带查询关联对象
prefetch_related() 预先查询
extra() 附加SQL查询
defer() 不加载指定字段
only() 只加载指定的字段
using() 选择数据库
select_for_update() 锁住选择的对象,直到事务结束。
raw() 接收一个原始的SQL查询

基本操作

# 获取所有数据,对应SQL:select * from User
User.objects.all()# 匹配,对应SQL:select * from User where name = '运维咖啡吧'
User.objects.filter(name='运维咖啡吧')# 不匹配,对应SQL:select * from User where name != '运维咖啡吧'
User.objects.exclude(name='运维咖啡吧')# 获取单条数据(有且仅有一条,id唯一),对应SQL:select * from User where id = 724
User.objects.get(id=123)

常用操作

# 获取总数,对应SQL:select count(1) from User
User.objects.count()
User.objects.filter(name='运维咖啡吧').count()# 比较,gt:>,gte:>=,lt:<,lte:<=,对应SQL:select * from User where id > 724
User.objects.filter(id__gt=724)
User.objects.filter(id__gt=1, id__lt=10)# 包含,in,对应SQL:select * from User where id in (11,22,33)
User.objects.filter(id__in=[11, 22, 33])
User.objects.exclude(id__in=[11, 22, 33])# isnull:isnull=True为空,isnull=False不为空,对应SQL:select * from User where pub_date is null
User.objects.filter(pub_date__isnull=True)# like,contains大小写敏感,icontains大小写不敏感,相同用法的还有startswith、endswith
User.objects.filter(name__contains="sre")
User.objects.exclude(name__contains="sre")# 范围,between and,对应SQL:select * from User where id between 3 and 8
User.objects.filter(id__range=[3, 8])# 排序,order by,'id'按id正序,'-id'按id倒叙
User.objects.filter(name='运维咖啡吧').order_by('id')
User.objects.filter(name='运维咖啡吧').order_by('-id')# 多级排序,order by,先按name进行正序排列,如果name一致则再按照id倒叙排列
User.objects.filter(name='运维咖啡吧').order_by('name','-id')

进阶操作

# limit,对应SQL:select * from User limit 3;
User.objects.all()[:3]# limit,取第三条以后的数据,没有对应的SQL,类似的如:select * from User limit 3,10000000,从第3条开始取数据,取10000000条(10000000大于表中数据条数)
User.objects.all()[3:]# offset,取出结果的第10-20条数据(不包含10,包含20),也没有对应SQL,参考上边的SQL写法
User.objects.all()[10:20]# 分组,group by,对应SQL:select username,count(1) from User group by username;
from django.db.models import Count
User.objects.values_list('username').annotate(Count('id'))# 去重distinct,对应SQL:select distinct(username) from User
User.objects.values('username').distinct().count()# filter多列、查询多列,对应SQL:select username,fullname from accounts_user
User.objects.values_list('username', 'fullname')# filter单列、查询单列,正常values_list给出的结果是个列表,里边里边的每条数据对应一个元组,当只查询一列时,可以使用flat标签去掉元组,将每条数据的结果以字符串的形式存储在列表中,从而避免解析元组的麻烦
User.objects.values_list('username', flat=True)# int字段取最大值、最小值、综合、平均数
from django.db.models import Sum,Count,Max,Min,AvgUser.objects.aggregate(Count(‘id’))
User.objects.aggregate(Sum(‘age’))

时间字段

# 匹配日期,date
User.objects.filter(create_time__date=datetime.date(2018, 8, 1))
User.objects.filter(create_time__date__gt=datetime.date(2018, 8, 2))# 匹配年,year,相同用法的还有匹配月month,匹配日day,匹配周week_day,匹配时hour,匹配分minute,匹配秒second
User.objects.filter(create_time__year=2018)
User.objects.filter(create_time__year__gte=2018)# 按天统计归档
today = datetime.date.today()
select = {'day': connection.ops.date_trunc_sql('day', 'create_time')}
deploy_date_count = Task.objects.filter(create_time__range=(today - datetime.timedelta(days=7), today)
).extra(select=select).values('day').annotate(number=Count('id'))

Q 的使用

Q对象可以对关键字参数进行封装,从而更好的应用多个查询,可以组合&(and)、|(or)、~(not)操作符。

例如下边的语句

from django.db.models import QUser.objects.filter(Q(role__startswith='sre_'),Q(name='公众号') | Q(name='运维咖啡吧')
)

转换成SQL语句如下:

select * from User where role like 'sre_%' and (name='公众号' or name='运维咖啡吧')

通常更多的时候我们用Q来做搜索逻辑,比如前台搜索框输入一个字符,后台去数据库中检索标题或内容中是否包含

_s = request.GET.get('search')_t = Blog.objects.all()
if _s:_t = _t.filter(Q(title__icontains=_s) |Q(content__icontains=_s))return _t

外键:ForeignKey

  • 表结构:
class Role(models.Model):name = models.CharField(max_length=16, unique=True)class User(models.Model):username = models.EmailField(max_length=255, unique=True)role = models.ForeignKey(Role, on_delete=models.CASCADE)
  • 正向查询:
# 查询用户的角色名
_t = User.objects.get(username='运维咖啡吧')
_t.role.name
  • 反向查询:
# 查询角色下包含的所有用户
_t = Role.objects.get(name='Role03')
_t.user_set.all()
  • 另一种反向查询的方法:
_t = Role.objects.get(name='Role03')# 这种方法比上一种_set的方法查询速度要快
User.objects.filter(role=_t)
  • 第三种反向查询的方法:

如果外键字段有related_name属性,例如models如下:

class User(models.Model):username = models.EmailField(max_length=255, unique=True)role = models.ForeignKey(Role, on_delete=models.CASCADE,related_name='roleUsers')

那么可以直接用related_name属性取到某角色的所有用户

_t = Role.objects.get(name = 'Role03')
_t.roleUsers.all()

M2M:ManyToManyField

  • 表结构:
class Group(models.Model):name = models.CharField(max_length=16, unique=True)class User(models.Model):username = models.CharField(max_length=255, unique=True)groups = models.ManyToManyField(Group, related_name='groupUsers')
  • 正向查询:
# 查询用户隶属组
_t = User.objects.get(username = '运维咖啡吧')
_t.groups.all()
  • 反向查询:
# 查询组包含用户
_t = Group.objects.get(name = 'groupC')
_t.user_set.all()

同样M2M字段如果有related_name属性,那么可以直接用下边的方式反查

_t = Group.objects.get(name = 'groupC')
_t.groupUsers.all()

get_object_or_404

正常如果我们要去数据库里搜索某一条数据时,通常使用下边的方法:

_t = User.objects.get(id=734)

但当id=724的数据不存在时,程序将会抛出一个错误

abcer.models.DoesNotExist: User matching query does not exist.

为了程序兼容和异常判断,我们可以使用下边两种方式:

  • 方式一:get改为filter
_t = User.objects.filter(id=724)
# 取出_t之后再去判断_t是否存在
  • 方式二:使用get_object_or_404
from django.shortcuts import get_object_or_404_t = get_object_or_404(User, id=724)
# get_object_or_404方法,它会先调用django的get方法,如果查询的对象不存在的话,则抛出一个Http404的异常

实现方法类似于下边这样:

from django.http import Http404try:_t = User.objects.get(id=724)
except User.DoesNotExist:raise Http404

get_or_create

顾名思义,查找一个对象如果不存在则创建,如下:

object, created = User.objects.get_or_create(username='运维咖啡吧')

返回一个由object和created组成的元组,其中object就是一个查询到的或者是被创建的对象,created是一个表示是否创建了新对象的布尔值

实现方式类似于下边这样:

try:object = User.objects.get(username='运维咖啡吧')created = False
exception User.DoesNoExist:object = User(username='运维咖啡吧')object.save()created = Truereturen object, created

执行原生SQL

Django中能用ORM的就用它ORM吧,不建议执行原生SQL,可能会有一些安全问题,如果实在是SQL太复杂ORM实现不了,那就看看下边执行原生SQL的方法,跟直接使用pymysql基本一致了

from django.db import connectionwith connection.cursor() as cursor:cursor.execute('select * from accounts_User')row = cursor.fetchall()return row

Django里面的sql查询语句相关推荐

  1. WordPress 常用数据库SQL查询语句大全

    https://www.wpdaxue.com/wordpress-sql.html 在使用WordPress的过程中,我们少不了要对数据库进行修改操作,比如,更换域名.修改附件目录.批量修改文章内容 ...

  2. SQL查询语句执行顺序详解

    查询操作是关系数据库中使用最为频繁的操作,也是构成其他SQL语句(如DELETE.UPDATE)的基础.当要删除或更新某些记录时,首先要查询出这些记录,然后再对其进行相应的SQL操作.因此基于SELE ...

  3. SQL查询语句总是先执行SELECT?你们都错了。。。

    来源 | infoq.cn/article/Oke8hgilga3PTZ3gWvbg 很多 SQL 查询都是以 SELECT 开始的.不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否 ...

  4. SQL 查询语句总是先执行 SELECT?你们都错了

    很多 SQL 查询都是以 SELECT 开始的.不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否可以对窗口函数返回的结果进行过滤"这个问题,得出的结论是"窗口函数 ...

  5. SQL 查询语句总是先执行 SELECT?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"1024"领取惊喜资料 很多 SQL 查询都是以 SELECT 开始的.不过,最近我跟 ...

  6. 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  7. 灵魂拷问,SQL 查询语句先执行 SELECT吗?

    大家平时和SQL语句打交道的时间肯定不少,有写过简单SQL的,也有为很复杂的业务逻辑的SQL绞尽脑汁的,那我在这里问下大家一个简单的问题:那你知道SQl语句的查询顺序是怎么样的吗? 当我刚看到这个问题 ...

  8. sql查询语句 -牛客学习笔记

    sql查询语句 1. limit 使用LIMIT限制结果集 LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数. LIMIT 接受一个或两个数字参数.参数必须是一个整数常量. 如果只给 ...

  9. SQL查询语句注入实战(手注,显注)

    目录 前言 条件查询 查询顺序 Limit限制结果 联合查询 显错位 SQL内置函数 自带数据库和表 mycli辅助命令 Sql注入类型 实战靶场 判断类型是否存在注入点,类型 看看他有几个字段 数据 ...

最新文章

  1. 笔记本通过网线连接并控制工控机
  2. MyEclipse提示键配置、提示快捷键、提示背景色、关键字颜色、代码显示
  3. 百度:YOLOX和NanoDet都没我优秀!轻量型实时目标检测模型PP-PicoDet开源
  4. 学习MongoDB 二:MongoDB添加、删除、修改
  5. 什么是Mac上的JDK路径? [重复]
  6. 开发日记-20190906 关键词 当当云阅读 ipad
  7. 再赠邓超明(帮别人名字作诗)
  8. tar time stamp in the future问题
  9. 论游戏项目中的左与右
  10. TIGK监控平台介绍
  11. IoT -- (二) 物联网传感器介绍
  12. 我们应该如何写好HTMLCSS
  13. 【优化算法】动态粒子群算法的动态环境寻优算法【含Matlab源码 1125期】
  14. ffmpeg显卡快速压制单/双语字幕视频
  15. java半角英数check_java - 关于全角半角介绍以及处理方式
  16. FRPS实现内网SSH服务器登陆
  17. 我的世界回连Center
  18. 小酷智慧地图3D导览v1.0.84 打卡定位 地图打卡
  19. 【推荐】无需路由器,利用WIN7开启wifi,手机高速上网
  20. 笔试逻辑智力题数列找规律小结

热门文章

  1. bzoj1969: [Ahoi2005]LANE 航线规划(树链剖分)
  2. 微信公众号用户OpenID同步导出系统
  3. 为什么我们要使用min-height和max-height样式属性?
  4. 博客园的祥和需要大家共同努力
  5. windows server 2008 r2 jar包后台启动_Sharing-Proxy部署amp;启动(4.0.0-RC3)
  6. php 如何根据经纬度计算距离,小程序实例:如何根据经纬度计算两点之间的距离(代码)...
  7. 计算机考研哪个专业代码少,考研专业代码到底是什么意思
  8. 制度化规范化标准化精细化_制度化、标准化、流程化,走向精细化管理的蜕变...
  9. 为什么函数lamda显示权限不足_一个简单的Vue按钮级权限方案
  10. 好用的python表白神器_Python|520表白神器