使用日期对查询集进行排序

Posted

技术标签:

【中文标题】使用日期对查询集进行排序【英文标题】:Sorting queryset with date 【发布时间】:2016-03-23 06:53:27 【问题描述】:

从问题here 扩展,其中使用用户输入过滤查询集,我想知道是否可以根据当前月份和周过滤查询集。例如,每个月应该从第 1 天开始,每周从星期一开始,查询集应该针对当前月份和本周发生的所有测试进行过滤。

models.py

class City(models.Model):
    city_name=models.CharField(max_length=100,default='',blank=False)

class Person(models.Model):
    title = models.CharField(max_length=3,default="mr",blank=False)
    name = models.CharField(max_length=50,default='',blank=False)
    address = models.CharField(max_length=200,default='',blank=False)
    city = models.ForeignKey(City)

class Test(models.Model):
    person = models.ForeignKey(Person)
    date = models.DateTimeField(auto_now_add=True)
    test_name = models.CharField(max_length=200,default='',blank=False)
    subject = models.CharField(max_length=100,default='')

views.py

def personlist(request, id):
data = requests.get('http://127.0.0.1:8000/app/cities/' + id + '/persons/').json()
context = RequestContext(request, 
'persons': data['results'],'count': data['count'],
)

return render_to_response('template.html', context)

以及相关的json

根据this 问题 - 一种方法可能是使用

startdate = date.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])

但是date.today() 不会每天都在变化,因此每天都会开始新的一周,从而产生一个新的查询集?与月份类似。有没有办法让查询集按当前周和月过滤。每个分别从每周一和每 1 日开始?

【问题讨论】:

【参考方案1】:

您可以使用__month__year 查找将查询集限制为本月的对象。

from datetime import date
today = date.today()
this_month_qs = Sample.objects.filter(
    date__month=today.month,
    date_year=today.year,
)

要查找本周的对象,您首先需要找到本周一的日期。您可以通过使用日期的 weekday() 方法找到一周中的今天(星期一 = 0,星期日 = 6)并从今天减去那么多天来做到这一点。一周的最后一天加上6天很容易计算出来,然后就可以用__range找到本周的对象了。

from datetime import date, timedelta
today = date.today()
# Use today.isoweekday() if you want the week
# to start on Sunday instead of Monday 
first_day_of_week = date.today() - timedelta(today.weekday())
end_date = first_day_of_week + timedelta(days=6)
this_week_qs = Sample.objects.filter(date__range=[startdate, enddate])

【讨论】:

date.today() 不给出字符串输出吗?您如何获得工作日的整数输出? 如代码所示,您可以使用其weekday() 方法获取日期的一周中的整数天。如果您在 shell 中尝试 date.today(),您会看到它没有返回字符串,而是返回了 datetime.date 实例。 是的,你是对的,但减去这些类型会引发错误TypeError: unsupported operand type(s) for -: 'datetime.date' and 'int' 正如您在问题中看到的,您可以使用timedelta 来添加或减去日期。我现在已经修复了代码。

以上是关于使用日期对查询集进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django 和 htmx 对查询集进行排序?

按日期排序对象列表,其中对象没有名称

按添加的字段对查询集进行排序

根据列表的顺序对过滤后的查询集进行排序

SQL多表联合查询按日期排序

组合和排序查询集