在django视图中通过日期范围过滤recoreds

时间:2015-11-19 08:55:39

标签: django view filter

我正在尝试通过视图过滤数据。我尝试了__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')

我尝试了不同的方法:

1

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时它不会显示任何记录。

2

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。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

问题在于您不了解range查找的工作原理。 它的使用方式如下:

Change.objects.filter(change_field__range=[start_datatime, end_datetime])

其中change_field是您要查询的Change模型的日期时间或日期字段。 start_datetimeend_datetime是您提供的日期时间对象。例如:

class Change(models.Mode):
    ...
    published = models.DateTimeField()
    ...

所以您的查询可能看起来像

Change.objects.filter(published__range=[datetime.datetime(2011, 2, 4), datetime.datetime(2011, 5,4)])

这将返回包含Change2011-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})