2010-06-08 30 views
9

Estoy tratando de escupir una página django que enumera todas las entradas por el año en que fueron creadas. Así, por ejemplo:Django: campo de fecha y hora de filtrado por * solo * el valor del año?

2010:

  • Nota 4

  • Nota 5

  • Nota 6

2009:

  • Nota 1

  • Nota 2

  • Nota 3

Está resultando más difícil de lo que hubiera esperado. El modelo de la que proviene de los datos es el siguiente:

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 

He intentado un par de maneras diferentes, pero parece encontrarse con obstáculos por todos los caminos. Supongo que un método efectivo de "agrupar por" haría el truco (PostGres DB Backend), pero parece que no puedo encontrar ninguna funcionalidad de Django que lo soporte. Intenté obtener años individuales de la base de datos, pero me costó encontrar una forma de filtrar los campos de fecha y hora por el valor del año. Finalmente, traté de agregar note_year @property pero como se deriva, no puedo filtrar esos valores.

¿Alguna sugerencia para una manera elegante de hacer esto? Me imagino que debería ser bastante sencillo, pero estoy teniendo un momento heckuva con él. Cualquier idea muy apreciada.

Respuesta

25

Cualquiera de construir SQL personalizada o utilizar

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

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

Ésta es la forma en que se lleva a cabo en las vistas genéricas basadas fecha.

+0

* risas * ¿Puede' Creo que fue así de fácil. pasó horas buscando este tipo de funcionalidad. Muchas gracias. – PlankTon

-1

de filtrar campos de fecha y hora con sólo el valor del año

la mejor manera sería

@property def note_year (auto): retorno self.created.year

Cuestiones relacionadas