django queryset filter datetimefield

Posted

技术标签:

【中文标题】django queryset filter datetimefield【英文标题】: 【发布时间】:2015-02-04 17:06:58 【问题描述】:

我很想将 django queryset API 参考与基于 DateTimeField 的过滤器一起使用。

我在我的 models.py 中准备了以下模型:

class KleedkamerIndeling(models.Model):

gametimedate = models.DateTimeField(auto_now=False, auto_now_add=False)    # date and time of game
hometeam = models.CharField(max_length=25, blank=True)                     # name of home playing team  team
homedres-s-room = models.CharField(max_length=25, blank=True)                # dressing room of home playing team
awayteam = models.CharField(max_length=25, blank=True)                     # name of visiting team team
awaydres-s-room = models.CharField(max_length=25, blank=True)                # dressing room of visiting team team
pitch = models.CharField(max_length=25, blank=True)                        # name / number of playing pitch
referee = models.CharField(max_length=25, blank=True)                      # name of referee
refdres-s-room = models.CharField(max_length=25, blank=True)                 # name/number of referee dres-s-room
timestamp = models.DateField(auto_now_add=True, auto_now=False)
indelings_datum = models.DateField() # need to change to datum added later

def __unicode__(self):
    return smart_unicode(self.hometeam)

我想根据当前日期访问数据库。应该是这样的:

queryset = KleedkamerIndeling.objects.all().filter(gametimedate=date.today())

这在我使用“日期字段”之前有效,但我决定使用日期时间字段,因为我还需要玩游戏的开始时间。

我已经搜索了网络和 ***,并找到了以下较旧的主题,How can I filter a date of a DateTimeField in Django?,但我对实现感到困惑。

我想创建一个查询集来获取今天可用的所有“KleedkamerIndeling”。随后我想检查列表中是否有超过 10 个对象。如果是这种情况,我想根据当前时间进一步缩小范围,也可以通过日期时间字段上的过滤器。最后,我想对对象列表进行排序,以便按时排序。

我知道我的问题与 datetimefield van 的特性有关,我感谢几行代码来帮助我前进。我整个下午都在尝试在 python manage.py shell 中找到正确的查询......

我的模型最有效,因为 queryset = KleedkamerIndeling.objects.all() 似乎有效,并且我能够为查询集列表中名为 'game0 到 game10 的每个对象设置单独的列表。

我对日期时间字段格式还有一个问题:

我定义了一个“KleedkamerIndeling”,它描述了一个从 13:00 开始的游戏。我使用查询集列表中的对象定义了 10 个不同的“游戏”对象。即 game0 = [queryset[0].hometeam 等...虽然 game10 如果适用。游戏时间字段通过过滤器显示在模板中,例如:game0.0|date:"H":game0.0|date:"i"。在没有 game0 对象的情况下,我仍然以 ':' 结束。我打算通过模板或视图中的 if else 脚本来解决这个问题,还是有更好的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

由于您使用的是日期时间字段,因此您希望使用日期时间对象进行查询。所以首先将查询集从最早到最新排序,然后过滤掉今天没有发生的事件。

from datetime import datetime, timedelta, time

today = datetime.now().date()
tomorrow = today + timedelta(1)
today_start = datetime.combine(today, time())
today_end = datetime.combine(tomorrow, time())

queryset = KleedkamerIndeling.objects.order_by('-gametimedate').filter(gametimedate__gte=today_start).filter(gametimedate__lt=today_end)

之后,我们可以检查是否有超过 10 个对象,按当前时间过滤,并将查询集限制为 10 个对象。

if queryset.count() > 10:
  queryset = KleedkamerIndeling.objects.filter(gametimedate__gte=datetime.now())[:10]

【讨论】:

太好了,这似乎有效。谢谢!在 python shell 中尝试此操作时确实收到并运行时预热。它指出“RuntimeWarning:DateTimeFiled KleedkamerIndeling.gametimedate 在时区支持处于活动状态时收到了一个幼稚的日期时间(2014-12-06 00:00:00)”。但除此之外它还有效! 时区可能很棘手,我建议阅读一些 djangos 文档docs.djangoproject.com/en/1.7/topics/i18n/timezones/…

以上是关于django queryset filter datetimefield的主要内容,如果未能解决你的问题,请参考以下文章

django queryset filter datetimefield

django中使用filter()(即对QuerySet操作)时踩的坑

django queryset合并问题

Django 难以使用 ModelAdmin.queryset 和 ModelAdmin.list_filter 来限制显示的过滤器 itrems

django查询中模糊的知识点,filter(blog=blog),filter(username=username).first()--这两者只需一招让你分清QuerySet对象,和用户字典对象(代

Django常用的QuerySet操作