2010-06-08 1 views
9

Я пытаюсь выплюнуть страницу django, в которой перечислены все записи за год, когда они были созданы. Так, например:Django: Фильтрация поля datetime * только * значение года?

2010:

  • Примечание 4

  • Примечание 5

  • Примечание 6

2009:

  • Примечание 1

  • Примечание 2

  • Примечание 3

Это оказалось более трудным, чем я ожидал бы. Модель, с которой приходит данные ниже:

class Note(models.Model): 
    business = models.ForeignKey(Business) 
    note = models.TextField() 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    class Meta: 
     db_table = 'client_note' 

    @property 
    def note_year(self): 
     return self.created.strftime('%Y') 

    def __unicode__(self): 
     return '%s' % self.note 

Я попробовал несколько различных способов, но, кажется, бежать в препятствия вниз каждый путь. Я предполагаю, что эффективный метод «group by» будет делать трюк (PostGres DB Backend), но я не могу найти никакой функциональности Django, которая ее поддерживает. Я пытался получить отдельные годы из базы данных, но я изо всех сил пытался найти способ фильтрации полей datetime только за год. Наконец, я попытался добавить note_year @property, но поскольку он получен, я не могу отфильтровать эти значения.

Любые предложения по элегантному способу сделать это? Я полагаю, что это должно быть довольно просто, но у меня есть время с heckuva. Любые идеи очень ценятся.

ответ

25

Либо строить пользовательские SQL или использовать

date_list = Note.objects.all().dates('created', 'year') 

for years in date_list: 
    Note.objects.filter(created__year = years.year) 

Это так, как это сделано в финиковых на основе общих взглядов.

+0

* смеется * Can» Я считаю, что это было легко; потраченные часы, ищущие такую ​​функциональность. Большое спасибо. – PlankTon

-1

Для фильтрации полой даты-времени лишь на значениях

года лучший способ будет

@property Защиту note_year (Я): возвращение self.created.year