通过django视图中的日期范围筛选记录

通过django视图中的日期范围筛选记录,django,view,filter,Django,View,Filter,我试图通过视图过滤数据。我尝试了_范围和_gte+_lte,但在网站上没有结果 型号: class Change(models.Model): def __unicode__(self): return unicode(self.number) number = models.IntegerField(verbose_name="CHG") service = models.ForeignKey('organization.Service') envi

我试图通过视图过滤数据。我尝试了_范围和_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. 在这种情况下,当只使用开始日期时,它工作正常,但当我添加结束日期时,它不会显示任何记录

2. 在这种情况下,我得到一个错误,全局名称start_date没有定义


非常感谢您的帮助。

问题是您不了解
范围查找是如何工作的。
它是这样使用的:

Change.objects.filter(change_field__range=[start_datatime, end_datetime])
其中,
change\u field
是要查询的
change
模型的日期时间或日期字段
start\u datetime
end\u datetime
是您提供的日期时间对象。例如:

class Change(models.Mode):
    ...
    published = models.DateTimeField()
    ...
因此,您的查询可能如下所示

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

这将返回带有
Change
对象的queryset,这些对象是在
2011-2-4
2011-5-4

之间发布的。在我看来,在您的上述代码中,开始日期和结束日期之间的时间差(开始日期和结束日期之间的差)是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})

你想从你的数据中得到什么结果?你能举个例子吗。@W我想查询一下变更数据库中的所有记录,看看今天是否有任何变更。有时,更改计划超过一天,所以我希望在网站上列出它,直到计划的结束日期。例如编号=765432,开始日期=2015年11月19日,结束日期=2015年11月22日。。。在日期范围内(19,20,21,22),我想在网站上显示它。提前非常感谢。我试图将其更改为添加时间增量,但不幸的是,它没有返回任何结果。开始日期=2015-11-19和结束日期=2015-11-22。数据库中的日期格式是否与您在查询中填写的日期格式相同,即yy-mm-dd?是的。奇怪的是,如果我只在过滤器中使用start_date_ugte=datetime.date.today(),它就可以工作了。它显示大于或等于今天日期的记录,但当我想用结束日期限制它时,不会显示任何记录。开始日期和结束日期都是models.DateField().Sweet,但我希望更改为与今天相同(这意味着它将每天动态分配。这就是为什么我认为我可以在视图中定义变量并将其传递给Change.objects.filter。然后我希望有一个datetime对象来定义范围,它们来自数据库(start_date和end_date)我不想提供静态值。@hplodur,
change\u field
是一个字段,而不是一个值,如果没有字段,您无法筛选对象,因此您不会按照自己的意愿进行筛选。您需要做的是创建一个范围,其中
start\u datetime
是当前一天的开始,
end\u datetime
是一天的结束这里是如何存档的。那么,如何查询具有有效起始日期和有效截止日期的价格数据表?我想为参考日期(如今天的日期)找到有效价格,您将如何处理?
Change.objects.filter(published__range=[datetime.datetime(2011, 2, 4), datetime.datetime(2011, 5,4)])
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})