2011-03-23 4 views
8

Ho un modello come questo:Come ottenere più recente di molti gruppi in una sola volta

class Foo(models.Model): 
    date = models.DateTimeField() 
    language = models.TextField() 
    # other stuff 

e voglio raggruppare i Foo s per lingua, quindi ottenere il più recente in ciascun gruppo. Non sono stato in grado di capire come utilizzare l'API QuerySet di django per fare ciò (onestamente, non so come farlo in SQL). Così, per esempio:

pk | date | language 
---+--------+------------------ 
1 | 1:00 | python 
2 | 1:30 | python/django 
3 | 1:45 | haskell 
4 | 2:15 | python 
5 | 2:45 | haskell 

voglio ottenere qualcosa di simile a questo risultato:

{ 'python': 4, 'python/django': 2, 'haskell': 5 } 

dove forse al posto dei numeri completato tali verifiche Foo oggetti.

+1

Avete una tabella separata per le lingue? In questo caso probabilmente saresti in grado di estrarre quei dati usando anotate() o qualcosa del genere. – Agonych

+0

@ Agonych, non vedo come sia importante avere un tavolo per le lingue. Stai suggerendo di tenere traccia dell'ultimo 'Foo' come un campo nella tabella delle lingue? – luqui

+0

No, ma è possibile estrarre la data più recente per ogni record con annotate (latest_date = Max ('foos__date') (fornendo foos is many_to_many con Foo) o utilizzando la funzione get_max_date() nel modello Language. – Agonych

risposta

0

Prova questo:

Foo.objects.values ​​('linguaggio') annotare (MAX_DATE = Max() 'data') order_by()

O è effettivamente necessario l'ID del record.. con la data massima?

Si potrebbe desiderare di leggere questo: http://docs.djangoproject.com/en/dev/topics/db/aggregation/

+0

Sì Ho bisogno degli ID/record stessi. – luqui

+0

Non riesci a ottenerlo in una query, perché questo modello consente di avere due record con gli stessi valori per "lingua" e "data" ma con un ID diverso. fare una query per ogni elemento nel set di risultati per trovare il suo ID effettivo. – Agonych

+4

La query stessa è abbastanza semplice: SELECT 'id', max (' date'), 'language' FROM foo group di' language' order di ' language'; – Agonych

2

È possibile utilizzare una query prima per risolvere i vostri problemi:

query = Foo.objects.raw('SELECT id, language, MAX(date) FROM sqltest_foo GROUP BY language;') 
for foo in query: 
    print foo.id, foo.language 

Obs: Sto usando la sintassi SQLite, ma altre lingue SQL dovrebbero essere simili .

Problemi correlati