2010-06-08 8 views
9

Ich versuche eine Django-Seite auszuspucken, die alle Einträge nach dem Jahr ihrer Erstellung auflistet. So zum Beispiel:Django: Filterung Datetime Feld von * nur * der Jahreswert?

2010:

  • Anmerkung 4

  • Anmerkung 5

  • Anmerkung 6

2009:

  • Anmerkung 1

  • Anmerkung 2

  • Note 3

es schwieriger erweist, als ich erwartet hätte. Das Modell, von dem kommt die Daten unter:

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 

ich ein paar verschiedene Möglichkeiten versucht haben, scheinen aber in Hürden hinunter jeden Weg zu laufen. Ich vermute, dass eine effektive "Group by" -Methode den Trick (PostGres DB Backend) machen würde, aber ich kann keine Django-Funktionalität finden, die sie unterstützt. Ich habe versucht, einzelne Jahre aus der Datenbank zu bekommen, aber ich hatte Mühe, eine Möglichkeit zu finden, Datetime-Felder um den Jahreswert zu filtern. Schließlich habe ich versucht, die Eigenschaft note_year @ hinzuzufügen, aber da diese abgeleitet ist, kann ich diese Werte nicht filtern.

Irgendwelche Vorschläge für einen eleganten Weg, dies zu tun? Ich denke, es sollte ziemlich einfach sein, aber ich habe eine Huckuva-Zeit damit. Irgendwelche Ideen sehr geschätzt.

Antwort

25

Entweder benutzerdefinierte SQL-Konstrukt oder verwenden

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

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

Dies ist so, wie es in Datum anhand generischen Ansichten erfolgt.

+0

* lacht * Can‘ Ich glaube, es war so einfach. verbrachte Stunden auf der Suche nach dieser Art von Funktionalität. Danke vielmals. – PlankTon

-1

Zum Filtern von Datetime-Felder von nur Jahreswert

der beste Weg

@property def note_year (Selbst-) wäre: return self.created.year

Verwandte Themen