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

时间:2015-12-16 23:05:37

标签: python django django-models django-views

从问题here扩展,其中使用来自用户的输入过滤queryset,我想知道是否可以根据当前月份和周来过滤查询集。例如,每个月应该从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 个答案:

答案 0 :(得分: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])