2014-12-06 3 views
2

DateTimeField를 기반으로하는 필터로 django queryset API 참조를 사용하려고합니다.django queryset filter 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를 검색했고 다음과 같은 이전 주제 인 How can I filter a date of a DateTimeField in Django?을 발견했지만 구현에 얽혀 있습니다.

오늘 날짜에 사용할 수있는 모든 'KleedkamerIndeling'을 가져 오는 쿼리 세트를 만들고 싶습니다. 그 후 목록에 10 개 이상의 개체가 있는지 확인하려고합니다. 그럴 경우, datetimefield의 필터를 통해 현재 시간을 기준으로 추가로 범위를 좁히고 싶습니다. 마지막으로 개체 목록을 정렬하여 시간순으로 정렬하려고합니다.

나는 내 문제가 datetimefield van의 caracteristics가 내가 앞으로 나아갈 수 있도록 몇 줄의 코드를 고맙게 생각한다는 것을 알고있다. 난 오후 내내 파이썬 manage.py 쉘에서 정확한 쿼리를 찾으려고 노력했다. ...

queryset = KleedkamerIndeling.objects.all()이 작동하는 것 같아서 내 모델을 설정하는 것이 가장 효과적이다. queryset 목록에서 'game0 through game10'이라는 각 객체에 대한 별도의 개별 목록을 만듭니다. 나는 13:00에 시작하는 게임을 설명하는 'KleedkamerIndeling를'정의

:

은 내가 datetimefield 형식에 더 문제가있다. 저는 쿼리 목록에있는 오브젝트를 사용하여 10 가지 '게임'객체를 정의했습니다. 즉 game0 = [queryset [0] .hometeam 등 ... 가능한 경우 game10. gametime 필드는 {{game0.0 | date : "H"}} : {{game0.0 | date : "i"}}와 같은 필터를 통해 템플릿에 표시됩니다. 게임 0 오브젝트가없는 경우에도 ':'로 끝납니다. 템플릿이나 뷰의 if else 스크립트를 통해이 문제를 해결할 계획입니까, 아니면이를 수정하는 더 좋은 방법이 있습니까?

답변

1

datetime 필드를 사용하고 있으므로 datetime 개체를 사용하여 쿼리를 만들고 싶습니다. 그래서 먼저 쿼리 세트를 가장 일찍부터 최신 순서로 정렬 한 다음 오늘 발생하는 이벤트를 걸러냅니다.

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 셸에서이 작업을 시도하는 동안 Runtimewarming을 받고 수신 했습니까? 'RuntimeWarning : DateTimeFiled KleedkamerIndeling.gametimedate는 시간대 지원이 활성화 된 상태에서 순진한 datetime (2014-12-06 00:00:00)을 받았습니다.' 그러나 이것과 별개로 작동합니다! – borreltijd

+0

시간대가 까다로울 수 있습니다. 장고 문서를 읽는 것이 좋습니다. https://docs.djangoproject.com/en/1.7/topics/i18n/timezones/#naive-and-aware-datetime-objects – Tim