我正在尝试通过视图过滤数据。我尝试了__range和__gte + __lte,但网站上没有结果。
模型:
class Change(models.Model):
def __unicode__(self):
return unicode(self.number)
number = models.IntegerField(verbose_name="CHG")
service = models.ForeignKey('organization.Service')
environment = models.CharField(choices=ENV_CHOICE, max_length=20)
description = models.CharField(max_length=50)
start_date = models.DateField()
start_time = models.TimeField()
end_date = models.DateField()
end_time = models.TimeField()
assignee = models.ForeignKey('organization.Assignee')
我尝试了不同的方法:
def home(request):
changes = Change.objects.all().filter(start_date__gte=datetime.date.today(), end_date__lte=datetime.date.today())
return render(request, 'index.html', {'changes' : changes})
在这种情况下,当只使用start_date__gte时它正常工作但是当我添加end_date__lte时它不会显示任何记录。
def home(request):
today = datetime.date.today()
changes = Change.objects.all(today__range=[start_date, end_date])
return render(request, 'index.html', {'changes' : changes})
在这种情况下,我得到并且没有定义错误全局名称start_date。
非常感谢你的帮助。
答案 0 :(得分:1)
问题在于您不了解range
查找的工作原理。
它的使用方式如下:
Change.objects.filter(change_field__range=[start_datatime, end_datetime])
其中change_field
是您要查询的Change
模型的日期时间或日期字段。 start_datetime
和end_datetime
是您提供的日期时间对象。例如:
class Change(models.Mode):
...
published = models.DateTimeField()
...
所以您的查询可能看起来像
Change.objects.filter(published__range=[datetime.datetime(2011, 2, 4), datetime.datetime(2011, 5,4)])
这将返回包含Change
和2011-2-4
之间发布的2011-5-4
个对象的查询集
答案 1 :(得分:0)
在我看来,在上面的代码中,开始日期和结束日期之间的timedelta(开始日期和结束日期之间的差异)为0.如果您的开始日期和结束日期相同,您应该在结束时间添加一些timedelta,就像这样。
def home(request):
changes = Change.objects.all().filter(start_date__gte=datetime.date.today(), \
end_date__lte=datetime.date.today() + datetime.timedelta(seconds=86400))
return render(request, 'index.html', {'changes' : changes})