2014-12-06 2 views
2

Я пытаюсь использовать ссылку API-интерфейса запроса django с фильтрами на основе DateTimeField.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 объектов. Если это так, я хочу еще сузить его в зависимости от текущего времени, также через фильтр на поле datetime. Наконец, я хочу отсортировать список объектов таким образом, чтобы он сортировался вовремя.

Я знаю, что моя проблема заключается в том, какие характеристики в datetimefield van я ценю пару строк кода, чтобы помочь мне двигаться вперед. Я пытаюсь найти правильный запрос в оболочке python manage.py весь день ....

Моя модель больше всего работает, потому что запросset = KleedkamerIndeling.objects.all(), похоже, работает, и я могу установить для каждого объекта, называемого «game0 through game10» из списка запросов.

У меня есть еще один вопрос о формате DateTimeField:

Я определил «KleedkamerIndeling», который описывает игру, которая начинается в 13:00. Я использовал объекты в списке запросов для определения 10 различных «игровых» объектов. то есть game0 = [queryset [0] .homeeam и т. д. хотя игра10, если применимо. Поле gametime отображается в шаблоне с помощью фильтра: {{game0.0 | date: "H"}}: {{game0.0 | date: "i"}}. Я все еще получаю «:» в случае без объекта game0. Я планирую решить это с помощью сценария 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 объектов, фильтр текущего времени, а также ограничить QuerySet 10 объектов.

if queryset.count() > 10: 
    queryset = KleedkamerIndeling.objects.filter(gametimedate__gte=datetime.now())[:10] 
+0

Отлично, это похоже на работу. Благодаря! Получали и Runtimewarming при попытке этого в оболочке python. В нем указано, что RuntimeWarning: DateTimeFiled KleedkamerIndeling.gametimedate получил наивное datetime (2014-12-06 00:00:00), а поддержка часового пояса активна ». Но кроме этого это работает! – borreltijd

+0

Временные интервалы могут быть сложными. Я бы рекомендовал прочитать некоторые документы djangos. Https://docs.djangoproject.com/en/1.7/topics/i18n/timezones/#naive-and-aware-datetime-objects – Tim

Смежные вопросы