django queryset过滤datetimefield

时间:2014-12-06 17:24:18

标签: python django filter django-queryset

我正在使用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
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())

之前我使用过&date;' datefield'但是我决定去日期时间场,因为我还需要比赛的开始时间。

我已经搜索了网络和stackoverflow,并找到了以下较旧的主题How can I filter a date of a DateTimeField in Django?,但我对实施情况进行了深入探讨。

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

我知道我的问题必须与datetimefield面包车的特性有关我欣赏几行代码来帮助我前进。我整个下午都试图在python manage.py shell中找到正确的查询....

我的模型大多数工作,因为queryset = KleedkamerIndeling.objects.all()似乎工作,我能够为查询集列表中名为' game0到game10的每个对象设置单独的列表。

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

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

1 个答案:

答案 0 :(得分:2)

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

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]