基本操作

# 获取所有数据,对应SQL:select * from User
User.objects.all()# 匹配,对应SQL:select * from User where name = 'Pala'
User.objects.filter(name='Pala')# 不匹配,对应SQL:select * from User where name != 'Pala'
User.objects.exclude(name='Pala')# 获取单条数据(有且仅有一条,id唯一),对应SQL:select * from User where id = 724
User.objects.get(id=123)
常用操作# 获取总数,对应SQL:select count(1) from User
User.objects.count()# 获取总数,对应SQL:select count(1) from User where name = 'Pala'
User.objects.filter(name='Pala').count()# 大于,>,对应SQL:select * from User where id > 724
User.objects.filter(id__gt=724)# 大于等于,>=,对应SQL:select * from User where id >= 724
User.objects.filter(id__gte=724)# 小于,<,对应SQL:select * from User where id < 724
User.objects.filter(id__lt=724)# 小于等于,<=,对应SQL:select * from User where id <= 724
User.objects.filter(id__lte=724)# 同时大于和小于, 1 < id < 10,对应SQL:select * from User where id > 1 and id < 10
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])# 不包含,not in,对应SQL:select * from User where id not in (11,22,33)
User.objects.exclude(id__in=[11, 22, 33])# 为空:isnull=True,对应SQL:select * from User where pub_date is null
User.objects.filter(pub_date__isnull=True)# 不为空:isnull=False,对应SQL:select * from User where pub_date is not null
User.objects.filter(pub_date__isnull=True)# 匹配,like,大小写敏感,对应SQL:select * from User where name like '%sre%',SQL中大小写不敏感
User.objects.filter(name__contains="sre")# 匹配,like,大小写不敏感,对应SQL:select * from User where name like '%sre%',SQL中大小写不敏感
User.objects.filter(name__icontains="sre")# 不匹配,大小写敏感,对应SQL:select * from User where name not like '%sre%',SQL中大小写不敏感
User.objects.exclude(name__contains="sre")# 不匹配,大小写不敏感,对应SQL:select * from User where name not like '%sre%',SQL中大小写不敏感
User.objects.exclude(name__icontains="sre")# 范围,between and,对应SQL:select * from User where id between 3 and 8
User.objects.filter(id__range=[3, 8])# 以什么开头,大小写敏感,对应SQL:select * from User where name like 'sh%',SQL中大小写不敏感
User.objects.filter(name__startswith='sre')# 以什么开头,大小写不敏感,对应SQL:select * from User where name like 'sh%',SQL中大小写不敏感
User.objects.filter(name__istartswith='sre')# 以什么结尾,大小写敏感,对应SQL:select * from User where name like '%sre',SQL中大小写不敏感
User.objects.filter(name__endswith='sre')# 以什么结尾,大小写不敏感,对应SQL:select * from User where name like '%sre',SQL中大小写不敏感
User.objects.filter(name__iendswith='sre')# 排序,order by,正序,对应SQL:select * from User where name = 'Pala' order by id
User.objects.filter(name='Pala').order_by('id')# 多级排序,order by,先按name进行正序排列,如果name一致则再按照id倒叙排列
User.objects.filter(name='Pala').order_by('name','-id')# 排序,order by,倒序,对应SQL:select * from User where name = 'Pala' order by id desc
User.objects.filter(name='Pala').order_by('-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
User.objects.filter(create_time__year=2018)
User.objects.filter(create_time__year__gte=2018)# 匹配月,month
User.objects.filter(create_time__month__gt=7)
User.objects.filter(create_time__month__gte=7)# 匹配日,day
User.objects.filter(create_time__day=8)
User.objects.filter(create_time__day__gte=8)# 匹配周,week_dayUser.objects.filter(create_time__week_day=2)
User.objects.filter(create_time__week_day__gte=2)# 匹配时,hour
User.objects.filter(create_time__hour=9)
User.objects.filter(create_time__hour__gte=9)# 匹配分,minute
User.objects.filter(create_time__minute=15)
User.objects.filter(create_time__minute_gt=15)# 匹配秒,second
User.objects.filter(create_time__second=15)
User.objects.filter(create_time__second__gte=15)# 按天统计归档
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='Tom') | Q(name='Pala')
)

转换成SQL语句如下:

select * from User where role like 'sre_%' and (name='Tom' or name='Pala')

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

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

外键: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='Pala')
_t.role.name

反向查询

# 查询用户的角色名_t = User.objects.get(username='Pala')
_t.role.name

第二种反向查询:

_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 = 'Pala')
_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)

方式二:使用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='Pala')
返回一个由object和created组成的元组,其中object就是一个查询到的或者是被创建的对象,created是一个表示是否创建了新对象的布尔值

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

try:object = User.objects.get(username='Pala')created = False
exception User.DoesNoExist:object = User(username='Pala')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

注意这里表名字要用app名+下划线+model名的方式

Django model select获取数据详细讲解

Django model select获取数据详细讲解相关推荐

  1. Django model select的各种用法详解

    <Django model update的各种用法介绍>文章介绍了Django model的各种update操作,这篇文章就是她的姊妹篇,详细介绍Django model select的用 ...

  2. html单页面显示多个文章,从单个html页面上的多个django应用模型获取数据

    我有一个名为Project_Name的项目和一个名为first_app的应用程序,其中包含一些文章. 我在我的主页上显示这些文章标题作为应用页面上文章的链接.从单个html页面上的多个django应用 ...

  3. django外键获取数据

    用django写一个项目时,使用外键获取数据遇到一个问题. models创建的购物车表: class CarModel(models.Model):user = models.ForeignKey(U ...

  4. Django数据库学习——获取数据

    1.获取所有数据行 all()方法返回数据表中的所有数据.all()方法相当于SQL中的"select * from ..." 2.获取排序数据 order_by()方法返回指定字 ...

  5. python diango 并发_python - django Model 并发写数据出现重复值

    问 题 view视图代码: @login_required def data(request, page, keyword,strEncode): current_username = request ...

  6. 前端mock数据详细讲解

    在实际的项目研发过程中,我们经常会遇到如下的尴尬场景: 前端开发依赖于后端接口数据,但是后台人员不足或者无法立即到位,前端迟迟不能开工,或者前端小伙子自己参照ui设计图,完成对应的静态页面(没有数据交 ...

  7. django model

    本文一篇完全介绍django的最重要的model 6.django model 模型是数据唯一而且准确的信息来源.它包含正在储存的数据的重要字段和行为.一般来说,每一个模型都映射一个数据库表. 这个模 ...

  8. Yaml版接口自动化详细讲解(Python + pytest + allure + log + yaml + mysql + redis + 钉钉通知 + Jenkins)

    目录 框架介绍 框架结构 框架功能讲解 common  # 配置 config.yaml  # 公共配置 setting.py  # 环境路径存放区域 data  # 测试用例数据 Files  #  ...

  9. django高级(五)使用ajax获取数据

    如果模型类已经迁移过,现在要新定义一个模型类,再迁移是失败的.此时可以先用SQL语句创建一个表,然后再去创建一个模型类,一一对应即可. SQL语句创建表: 模型类: class AreaInfo(mo ...

  10. django model数据 时间格式

    from datetime import datetime dt = datetime.now() print '时间:(%Y-%m-%d %H:%M:%S %f): ' , dt.strftime( ...

最新文章

  1. Windows环境下启动Mysql服务提示“1067 进程意外终止”的解决方案
  2. 探讨增强现实(AR)基于模型的追踪技术
  3. [计算机网络] C++模拟telnet登陆SMTP服务发送邮件过程
  4. 面试题编程题11-python 生成随机数
  5. linux配置python_Linux--linux下配置安装python3
  6. 微软官方Windows Server 2008实战攻略系列
  7. 对unicode数据进行部分replace
  8. python throw error_Python实用笔记——错误处理
  9. 17.卷1(套接字联网API)--- ioctl 操作
  10. vector public member function
  11. authorware学习
  12. 《线性代数及其应用》系列笔记
  13. ectouch v1 thinkphp的搜索问题
  14. 整理了一份嵌入式软件工具清单!
  15. 网站实现QQ登陆功能
  16. 第四节 二维连续型随机变量及分布、条件概率密度
  17. java微信素材编辑_Java微信公众平台开发之素材管理(Spring Boot 2.X)
  18. python每日一个小程序_Python 练习册,每天一个小程序
  19. 女朋友没工作没文化不上进,甩都甩不掉,我疯了
  20. 站长导航系统源码-修复版

热门文章

  1. PDF文件中的图片导出
  2. 传奇服务器攻城文件,仿盛大传奇沙巴克攻防战与比奇怪物攻城说明
  3. Basic认证方式的配置
  4. html基础教学ppt,HTML5基础培训ppt课件
  5. java梯形_如何绘制梯形?
  6. stm32L151低功耗学习——Alarm闹钟周期唤醒(10s/10min/10h)
  7. 小米MIUI夺冠!鲁大师发布2021年Q3季度UI排行!
  8. 互联网日报 | 4月5日 星期一 | 华为首款台式显示器登陆海外;腾讯视频VIP会员4月10日起涨价;我国民宿房源超300万套...
  9. (报错解决)Exception encountered during context initialization
  10. 高位压迫——萨基给世界足坛带来的技术革命