ANSHENG'S BLOG
Django ORM获取指定天数据的几种方式
# django# pythonpublishDate · 2018-12-16 / lastEditedTime · 2022-04-06 04:49:00

环境准备

假设你已经创建了虚拟环境并安装好了Django

  • 查看版本
# 系统是Ubuntu $ uname -a Linux Ubuntu 4.10.0-19-generic #21-Ubuntu SMP Thu Apr 6 17:04:57 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux # 我用的是django 1.11.2版的 $ django-admin --version 1.11.2
  • 创建项目
$ django-admin startproject d
  • 创建app
$ python manage.py startapp db
  • 创建models
# - db/models.py from django.db import models # Create your models here. class Language(models.Model): name = models.CharField(max_length=15) add_time = models.DateTimeField()
  • settings.py注册app
INSTALLED_APPS = [ ... 'db', ]
  • 初始化数据库
$ python manage.py makemigrations $ python manage.py migrate
  • 添加测试数据
# python manage.py shell from db.models import Language from django.utils import timezone from datetime import timedelta,date current_date=timezone.now() # 当前时间 2017-06-04 19:48:30 Language.objects.create(name='Python',add_time=current_date - timedelta(days=1)) Language.objects.create(name='C',add_time=current_date - timedelta(days=1)) Language.objects.create(name='C++',add_time=current_date - timedelta(days=2)) Language.objects.create(name='Java',add_time=current_date - timedelta(days=2)) Language.objects.create(name='Go',add_time=current_date - timedelta(days=3)) Language.objects.create(name='JS',add_time=current_date - timedelta(days=3))

实操

以下的操作都是为了获取2017-06-03的数据,过滤出来的结果应该都是下面的内容

<QuerySet [{'id': 1, 'add_time': datetime.datetime(2017, 6, 3, 11, 17, 31, 848500, tzinfo=<UTC>), 'name': 'Python'}, {'id': 2, 'add_time': datetime.datetime(2017, 6, 3, 11, 17, 31, 848500, tzinfo=<UTC>), 'name': 'C'}]>
  • contains

过滤年月日字符串是否存在

Language.objects.filter(add_time__contains=date(2017, 6, 3)).values()
  • startswith

是否以指定年月日开头

Language.objects.filter(add_time__startswith=date(2017, 6, 3)).values()
  • __year/__month/__day

制定年月日

Language.objects.filter(add_time__year=2017,add_time__month=6,add_time__day=3).values()
  • date

date是在django1.9.x新增的

Language.objects.filter(add_time__date=date(2017, 6, 3)).values()
  • range

制定一个日期的范围

Language.objects.filter(add_time__range=(current_date, current_date + timedelta(days=1))).values()

stackoverflow也有一篇比较好的回答:

When USE_TZ is True, fields are converted to the current time zone before filtering.