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';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM