2014-12-06 136 views
2

我在使用基于DateTimeField的过滤器来使用django queryset API引用。django queryset筛选日期时间域

我已经准备了下面的模型,在我的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字段,因为我还需要比赛的开始时间播放之前这个工作。

我已经找到了网页和计算器,发现了以下旧主题How can I filter a date of a DateTimeField in Django?,但是我在实施中遇到了一些问题。

我想创建一个查询集,以获取当今日期可用的所有'KleedkamerIndeling'。随后我想检查列表中是否有多个对象。如果是这种情况,我想根据当前时间进一步缩小范围,也可以通过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

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

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] 
+0

太棒了,这似乎工作。谢谢!在python shell中尝试使用时收到和运行时间预热。它表示'RuntimeWarning:DateTimeFiled KleedkamerIndeling.gametimedate收到了一个天真的日期时间(2014-12-06 00:00:00),而时区支持处于活动状态“。但除此之外,它的作品! – borreltijd 2014-12-06 19:09:04

+0

时区可能会很棘手我建议通过一些djangos文档阅读https://docs.djangoproject.com/en/1.7/topics/i18n/timezones/#naive-and-aware-datetime-objects – Tim 2014-12-06 19:38:36