【问题标题】:filtering recoreds through date range in django view在 django 视图中通过日期范围过滤记录
【发布时间】:2016-02-21 07:36:30
【问题描述】:

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

非常感谢您的帮助。

【问题讨论】:

  • 你想从你的数据中得到什么结果?能否请您发布示例。
  • @Wtower 我想查询更改数据库中的所有记录,并检查今天是否有任何更改。有时更改计划超过一天,所以我希望将其列在网站上,直到预定的结束日期。例如 number = 765432, ... , start_date = 2015-11-19, ... , end_date = 2015-11-22, ... 在日期范围内 (19, 20, 21, 22) 我想让它显示在网站上。非常感谢您。

标签: django view filter


【解决方案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)])

这将返回带有Change 对象的查询集,这些对象在2011-2-42011-5-4 之间发布

【讨论】:

  • 甜蜜,但我希望change_field等于今天(这意味着它将每天动态分配。这就是为什么我认为我可以在视图中定义变量并将其传递给Change .objects.filter。然后我想要一个定义范围的日期时间对象,它们来自模型的数据库(开始日期和结束日期)。我不想提供静态值。
  • @hplodur, change_filed 是一个字段,而不是一个值,您无法过滤没有字段的对象,因此您不会按照自己的意愿进行操作。您需要做的是创建一个范围,其中start_datetime 是当天的开始,end_datetime 是当天的结束。这是您如何归档此stackoverflow.com/questions/14972802/…
  • 那么,您如何使用 valid_fromvalid_to 日期查询表中的 price 数据?我想为参考日期(例如今天的日期)找到有效的价格,您将如何进行?
【解决方案2】:

在我看来,在您上面的代码中,开始日期和结束日期之间的 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})

【讨论】:

  • 我尝试更改它以添加时间增量,但不幸的是它没有返回任何结果。 start_date = 2015-11-19 和 end_date = 2015-11-22。
  • db 中的日期格式是否与您在查询中编写的格式相同,即 yy-mm-dd?
  • 是的。奇怪的是,如果我只在过滤器中使用 start_date__gte=datetime.date.today() ,它就可以工作。它显示大于或等于今天日期的记录,但是当我想用 end_date__lte 限制它时,不显示记录。 start_date 和 end_date 都是 models.DateField()。
猜你喜欢
  • 2019-03-10
  • 2016-08-14
  • 1970-01-01
  • 2015-04-10
  • 2020-09-08
  • 2020-03-09
  • 2014-09-04
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多