2012-08-06 10 views
9

Ecco la mia query di database:Django: Utilizzando Annotate, il conte e distinti su un Queryset

results = Attachments.objects.filter(currency='current').annotate(num_attachments=Count('article_id')).order_by("num_attachments").distinct('article_id') 

La query così ripartiti (se ho capito bene):

  • primo filtro è Allegati attuali che sono "attuali".
  • Quindi per contare il numero di tali allegati con un determinato 'article_id'.
  • Quindi annotare ogni Allegato con il numero di Allegato con il numero di quelli che hanno article_id in comune.
  • Quindi per classificare in base al numero di allegati.
  • Quindi, analizzando l'elenco con distinti, in modo che sia presente un oggetto Allegato per ciascun valore article_id.

L'ho eseguito su PostgreSQL, quindi secondo Django docs, sto bene per eseguire distinti() in base a un campo.

Non v'è alcun errore quando si esegue la query, ma quando provo a iterare o addirittura stampare i risultati il ​​seguente errore viene generato da Django debug:

NotImplementedError at /function/ 
annotate() + distinct(fields) not implemented. 

Il traceback più dettagliato dal prompt interattivo è :

File "<console>", line 1, in <module> 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 118, in _result_iter 
    self._fill_cache() 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 875, in _fill_cache 
    self._result_cache.append(self._iter.next()) 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 291, in iterator 
    for row in compiler.results_iter(): 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 763, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 808, in execute_sql 
    sql, params = self.as_sql() 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 107, in as_sql 
    "annotate() + distinct(fields) not implemented.") 
NotImplementedError: annotate() + distinct(fields) not implemented. 

Qualcuno sa cosa sta succedendo qui?

+2

sembra abbastanza semplice. 'NotImplementedError' è un'eccezione di Django. Il codice lo sta sollevando per farti sapere che non puoi combinare insieme 'annotate' e' distinct' (con i campi) in questo momento, il che significa che non funziona in questo momento. Potrebbero risolvere qualunque problema ci sia in futuro, ma per il momento non sei fortunato. Puoi sempre ricorrere a 'raw' e fare quello che vuoi. –

+0

Nell'esempio di codice sopra manca un punto "." tra order_by e campo distinto. – Mikael

+0

@Chris qualsiasi idea su una query alternativa (oltre a SQL raw) per realizzare la stessa cosa? – Pat

risposta

5

La soluzione consiste nell'utilizzare values('distinct_fieldname') poiché ciò farà sì che l'istruzione SQL finale esegua GROUP BY su tale campo (è possibile aggiungere più di un nome di campo), che essenzialmente è lo stesso.

Per esempio, se volete sapere quanti articoli esiste per un dato 'filename' si dovrebbe fare questo:

results = Attachments.objects.filter(currency='current').values('filename').annotate(num_attachments=Count('article_id')).order_by("num_attachments") 
Problemi correlati