zoukankan      html  css  js  c++  java
  • 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:code202003MyDjango>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:code202003MyDjango>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';
    
  • 相关阅读:
    Java面试题
    删除两个相同的数据
    Oracle中的rowid rownum
    SQL的七种连接
    Oracle的分页和MySQL的分页
    Script to Collect Log File Sync Diagnostic Information (lfsdiag.sql) (文档 ID 1064487.1)
    Analytic Functions in Oracle
    Oracle X$Tables
    Microsoft SQL Server Trace Flags
    Oracle Log Block Size
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/13205487.html
Copyright © 2011-2022 走看看