2012-09-21 18 views
5

Tener el siguiente modelo:ORM de Django y hstore: recuento de valores únicos de una clave

from django_hstore import hstore 
from django.db import models 

class Item(VoteModel): 
    data = hstore.DictionaryField(db_index=True) 
    objects = hstore.HStoreManager() 

Algo así como:

Item.objects.extra(select={"key": "content_item.data -> 'key'"}).aggregate(Count('key')) 

no funciona, cf. Using .aggregate() on a value introduced using .extra(select={...}) in a Django Query? y https://code.djangoproject.com/ticket/11671.

El SQL prima que funciona es la siguiente:

SELECT content_item.data -> 'key' AS key, count(*) FROM content_item GROUP BY key;                    
    key  | count 
-----------+------- 
value1 | 223 
value2 | 28 
value3 | 31 
(3 rows) 

¿Cómo puedo obtener HTE mismos resultados a través de ORM de Django?

FYI:

Item.objects.extra(select={"key": "content_item.data -> 'key'"}) 

se traduce en:

SELECT (content_item.data -> 'key') AS "key", "content_item"."id", "content_item"."data" FROM "content_item" 

Respuesta

7

¿Has probado con los valores y order_by?

Item.objects.extra(
    select=dict(key = "content_item.data -> 'key'") 
).values('key').order_by('key').annotate(total=Count('key')) 

Algo como esto funciona para mí en PostgreSQL y Django 1.4.

+1

Ahaa, listo, muchas gracias! Sabía que podía obtener una lista con 'values ​​('clave')' pero también fallé al tratar de usar 'aggregate' en ella. Tendré que dedicar más tiempo a entender completamente cómo funcionan las abstracciones orm :) –

+0

@MaximeR .: debido a la dependencia de la aplicación "admin" en el ORM, tengo que tragarlo, pero en mi humilde opinión el ORM es el componente más débil en el marco de Django. Sueño con alguien clonando la aplicación de administración de Django usando Flask, SQLAlchemy y Jinja2. –

+0

@AlexK: para mí 'django.contrib.admin' es una aplicación asesina (no Django en sí), debería dedicar algo de tiempo y hacer un clon desacoplado de cualquier ORM específico. –

Cuestiones relacionadas