2012-09-21 39 views
5

Có mô hình sau:Django ORM & hstore: đếm các giá trị độc đáo của một phím

from django_hstore import hstore 
from django.db import models 

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

Cái gì như:

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

không hoạt động, xem Using .aggregate() on a value introduced using .extra(select={...}) in a Django Query?https://code.djangoproject.com/ticket/11671.

SQL liệu mà các công trình như sau:

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

Làm thế nào tôi có thể nhận được kết quả tương tự thông qua HTE ORM Django?

FYI:

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

dịch để:

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

Trả lời

7

Bạn đã thử với các giá trị và order_by?

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

Điều gì đó tương tự với tôi trong PostgreSQL và Django 1.4.

+1

Ahaa, thông minh, cảm ơn rất nhiều! Tôi biết tôi có thể nhận được một danh sách với 'giá trị ('key')' nhưng cũng không cố gắng sử dụng 'aggregate' vào nó. Tôi sẽ phải dành thêm một chút thời gian để hiểu đầy đủ cách thức hoạt động của orm abstractions đó :) –

+0

@MaximeR .: vì sự phụ thuộc ứng dụng "admin" trên ORM tôi phải nuốt nó, nhưng IMHO ORM là thành phần yếu nhất trong khung Django. Tôi mơ ước với một người nào đó nhân bản ứng dụng quản trị Django bằng cách sử dụng Flask, SQLAlchemy và Jinja2. –

+0

@ AlexK: đối với tôi 'django.contrib.admin' là một ứng dụng sát thủ (không phải bản thân Django), tôi nên dành thời gian và tạo một bản sao được tách riêng khỏi bất kỳ ORM cụ thể nào. –

Các vấn đề liên quan