Джанго: Фильтрация поля даты и времени по * только * значению года? - PullRequest
9 голосов
/ 08 июня 2010

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

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, которая его поддерживает. Я пытался получить отдельные годы из базы данных, но изо всех сил пытался найти способ фильтрации полей даты и времени только по значению года. Наконец, я попытался добавить note_year @property, но, поскольку он является производным, я не могу отфильтровать эти значения.

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

Ответы [ 2 ]

28 голосов
/ 08 июня 2010

Либо создайте пользовательский SQL, либо используйте

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

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

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

3 голосов
/ 08 июня 2010

Вы можете использовать django.views.generic.date_based.archive_year или использовать year поиск поля.

...