我正在使用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脚本来解决这个问题,还是有更好的方法来解决这个问题?
答案 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]