专栏首页从零开始学自动化测试python测试开发django-75.ORM根据日期查询(__range)

python测试开发django-75.ORM根据日期查询(__range)

前言

在使用django的 ORM 查询时候,我想查询最近3天的数据,需根据日期查询某一段时间的数据

时间筛选方式

可以根据 year、month、day、week_day 查询对应时间的记录

比如我表里面的字段是add_time, model 模型名称是 Card

先进 shell 交互模式,使用__year查询2020年的所有数据

MyDjango>python manage.py shell
>>> from yoyo.models import Card
>>> Card.objects.filter(add_time__year=2020)
<QuerySet [<Card: 1000000000002222>, <Card: 520000000001>,
<Card: 800080001>, <Card: 800080002>, <Card: 800080003>,
<Card: 800080004>, <Card: 800080005>, <Card: 800080006>,
<Card: 800080007>]>

使用__month查询6月的所有数据

>>> Card.objects.filter(add_time__month=6)
<QuerySet [<Card: 1000000000002222>, <Card: 520000000001>,
<Card: 800080001>, <Card: 800080002>, <Card: 800080003>,
<Card: 800080004>, <Card: 800080005>, <Card: 800080006>,
<Card: 800080007>]>

使用__day查询28号的所有数据

>>> Card.objects.filter(add_time__day=28)
<QuerySet [<Card: 800080007>]>

使用__week_day查询星期几的所有数据(星期天是一周的第1天)

>>> Card.objects.filter(add_time__week_day=1)
<QuerySet [<Card: 1000000000002222>, <Card: 800080007>]>

也可以结合使用,如查询6月28号的所有数据

>>> Card.objects.filter(add_time__month=6).filter(add_time__day=28)
<QuerySet [<Card: 800080007>]>

__range查询范围

ORM 里面可以使用__range 来限制查询范围,如果我想获取最近三天的范围,先获取系统的当前时间。 在当前时间的基础上,减去3天,就是前3天的时间,使用 python 的 datetime 模块获取当前时间。

import datetime
# 作者-上海悠悠 QQ交流群:717225969

# 当前日期 2020-06-28
now = datetime.datetime.now().date()
print(now)
# 减去3天,获取三天前的日期 2020-06-25
start_date = now- datetime.timedelta(3)
print(start_date)

进shell 模式使用__range 限制查询日期范围2020-06-25到2020-06-28所有数据

# 作者-上海悠悠 QQ交流群:717225969
D:\code202003\MyDjango>python manage.py shell
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from yoyo.models import Card
>>> import datetime
>>> now = datetime.datetime.now().date()
>>> start_date = now- datetime.timedelta(3)
>>> Card.objects.filter(add_time__range=[start_date,now])
<QuerySet [<Card: 800080003>, <Card: 800080004>, <Card: 800080005>, <Card: 800080006>]>
>>>

Q查询

也可以使用 Q 查询,先导入 Q

from django.db.models import Q 查询大于 start_date 日期,并且小于 now 日期。gt 是大于, lt 是小于

# 作者-上海悠悠 QQ交流群:717225969
D:\code202003\MyDjango>python manage.py shell
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>> from yoyo.models import Card
>> from django.db.models import Q
>> import datetime
>> now = datetime.datetime.now().date()
>> start_date = now- datetime.timedelta(3)
>> Card.objects.filter(Q(add_time__gt=start_date) & Q(add_time__lt=now))
<QuerySet [<Card: 800080003>, <Card: 800080004>, <Card: 800080005>, <Card: 800080006>]>
>>

使用 __range 查询和 Q查询2种方式都可以,效果跟下面的 SQL 语句一样

select * from yoyo_card where date(add_time) between '2020-06-25' and '2020-06-28';

本文分享自微信公众号 - 从零开始学自动化测试(yoyoketang),作者:上海悠悠

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python测试开发django-76.ORM查询之Q查询

    ORM 使用 filter() 查询的时候,当有多个条件的时候,可以使用 Q 查询

    上海-悠悠
  • anyproxy学习2-rule模块实现接口mock功能

    AnyProxy不仅仅可以抓包,还可以拦截请求并修改服务端响应,实现接口mock功能。 面试时候经常会问到第三方支付如何测试这种,如果对接的第三方没提供测试环境...

    上海-悠悠
  • appium+python自动化52-多点触控MultiAction

    MultiAction是针对多点触控操作的,是TouchAction的一个补充模块 TouchAction用法参考前面的一篇:appium+python自动化3...

    上海-悠悠
  • 远程连接redis

    2.redis-cli.exe -h 192.168.1.xxx -p 6379 -a xxxx

    ydymz
  • R语言之可视化③点图续

    函数scale_x_discrete可用于将项目的顺序更改为“2”,“0.5”,“1”:

    用户1359560
  • 'module' object has

      File "threading.py", line 2, in <module>

    py3study
  • 用openssl库RSA加密解密

    1 #include <stdio.h> 2 #include <openssl/rsa.h> 3 #include <openssl/pem.h> 4...

    窗户
  • 案例解析:海底捞、银行、商务酒店、香水单品市场、运营和销售数据挖掘

    沉默的白面书生
  • 微信小程序|简单易上手的画板功能

    大部分安卓用户的手机里是没有自带画板功能的,而在近期网课盛行之时,一个随手可用的手写面板,无论是在写笔记方面,还是在辅助授课方面,一个小画板就体现出了很大的作用...

    算法与编程之美
  • [PHP] 通用网关接口CGI 的运行原理

    CGI 的运行原理: 1.客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器发出请求。 ...

    陶士涵

扫码关注云+社区

领取腾讯云代金券