Aquí está mi consulta de base de datos:Django: El uso de anotación, el conde y distinto en un queryset
results = Attachments.objects.filter(currency='current').annotate(num_attachments=Count('article_id')).order_by("num_attachments").distinct('article_id')
La consulta desglosado de la siguiente manera (como yo lo entiendo):
- primer filtro es Adjuntos actuales que son "actuales"
- Luego, cuente el número de esos Adjuntos con un cierto 'article_id'.
- Luego anotar cada Adjunto con el número de Adjunto con el número de aquellos que tienen article_id en común.
- Luego, clasifique según la cantidad de archivos adjuntos.
- Luego, reduciendo la lista con distinct, para que haya un objeto Attachment para cada valor de article_id.
Estoy ejecutando esto en PostgreSQL, entonces de acuerdo con el Django docs, estoy bien para ejecutar distinct() basado en un campo.
no hay error cuando ejecuto la consulta, pero cuando trato de repetir o incluso imprimir los resultados el siguiente error es lanzada por Django depuración:
NotImplementedError at /function/
annotate() + distinct(fields) not implemented.
El rastreo más detallada desde el modo interactivo es :
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.
¿Alguien sabe qué está pasando aquí?
parece bastante sencillo. 'NotImplementedError' es una excepción de Django. El código lo está subiendo para hacerle saber que no puede combinar 'annotate' y' distinct' (con los campos) juntos en este momento, lo que significa que no funciona en este momento. Podrían resolver cualquier problema relacionado con esto en el futuro, pero por ahora no tiene suerte. Siempre puedes recurrir a 'raw' y hacer lo que quieras. –
En el ejemplo de código anterior, falta un punto "." entre el campo order_by y distinct. – Mikael
@ Chris cualquier idea sobre una consulta alternativa (además de SQL sin procesar) para lograr lo mismo? – Pat