Django QuerySet筛选DateTimeField

4

我正在努力使用Django的查询集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
homedressroom = 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
awaydressroom = 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
refdressroom = models.CharField(max_length=25, blank=True)                 # name/number of referee dressroom
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())

之前我用 'datefield' 可以运行,但因为需要游戏开始的时间,所以决定转换成 datetimefield。

我在网上和stackoverflow上搜到了一个旧话题,如何在Django中过滤DateTimeField的日期? 但是我遇到了一些实现上的问题。

我想创建一个查询集,获取今天日期所有可用的 'KleedkamerIndeling',然后检查列表中是否有超过10个对象。如果是这样,我还想进一步根据当前时间缩小范围,也通过对datetimefield进行筛选。最后,我想对对象列表进行排序,使其按时间排序。

我知道我的问题与datetimefield的特性有关,希望能给我几行代码来帮助我前进。我一下午都在试图在 python manage.py shell 中找到正确的查询语句...

我的模型肯定没有问题,因为 queryset = KleedkamerIndeling.objects.all() 看起来正常,并且我能够为每个对象设置单独的列表,称为“game0 through game10 from the queryset list”。

我在 datetimefield 格式上还有一个问题:

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

1个回答

3

由于您使用了日期时间字段,因此希望您使用日期时间对象进行查询。首先按照从早到晚的顺序对查询集进行排序,然后过滤掉今天不会发生的事件。

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接收到一个naive datetime(2014-12-06 00:00:00),而时区支持是活动的”。但除此之外,它可以工作! - borreltijd
时区可能会很棘手,我建议阅读一些Django文档 https://docs.djangoproject.com/en/1.7/topics/i18n/timezones/#naive-and-aware-datetime-objects - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接