widgets form fields example bootstrap django django-models django-queryset

form - django templates settings



django forma más eficiente de contar los mismos valores de campo en una consulta (4)

Digamos si tengo un modelo que tiene muchos campos, pero solo me importa un charfield. Digamos que charfield puede ser cualquier cosa, así que no conozco los valores posibles, pero sé que los valores se superponen con frecuencia. Entonces podría tener 20 objetos con "abc" y 10 objetos con "xyz" o podría tener 50 objetos con "def" y 80 con "stu" y tengo 40000 sin superposición, lo que realmente no me importa.

¿Cómo cuento los objetos de manera eficiente? Lo que me gustaría devolver es algo así como:

{''abc'': 20, ''xyz'': 10, ''otro'': 10,000}

o algo así, sin hacer una tonelada de llamadas SQL.

EDITAR:

No sé si alguien verá esto, ya que estoy editando algo tarde, pero ...

Tengo este modelo:

class Action(models.Model): author = models.CharField(max_length=255) purl = models.CharField(max_length=255, null=True)

y de las respuestas, he hecho esto:

groups = Action.objects.filter(author=''James'').values(''purl'').annotate(count=Count(''purl''))

pero...

esto es lo que los grupos son:

{"purl": "waka"},{"purl": "waka"},{"purl": "waka"},{"purl": "waka"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "lora"}

(Acabo de llenar Purl con valores ficticios)

lo que quiero es

{''waka'': 4, ''mora'': 5, ''lora'': 1}

Con suerte, alguien verá esta edición ...

EDICION 2:

Aparentemente mi base de datos (BigTable) no admite las funciones agregadas de Django y esta es la razón por la que he estado teniendo todos los problemas.


A menos que el valor de su campo siempre esté garantizado en un caso específico, puede ser útil transformarlo antes de realizar un conteo, es decir, ''apple'' y ''Apple'' se tratarán como iguales.

from django.db.models import Count from django.db.models.functions import Lower MyModel.objects.annotate(lower_title=Lower(''title'')).values(''lower_title'').annotate(num=Count(''lower_title'')).order_by(''num'')



Esto se llama agregación, y Django lo admite directamente .

Puede obtener su salida exacta filtrando los valores que desea contar, obteniendo la lista de valores y contándolos, todo en un conjunto de llamadas a la base de datos:

from django.db.models import Count MyModel.objects.filter(myfield__in=(''abc'', ''xyz''))./ values(''myfield'').annotate(Count(''myfield''))


Puede usar la aggregation Count de Django en un conjunto de consulta para lograr esto. Algo como esto:

from django.db.models import Count queryset = MyModel.objects.all().annotate(count = Count(''my_charfield'')) for each in queryset: print "%s: %s" % (each.my_charfield, each.count)