Django ORM&hstore:计算密钥的唯一值

Max*_* R. 5 python django postgresql orm hstore

拥有以下型号:

from django_hstore import hstore
from django.db import models

class Item(VoteModel):
    data = hstore.DictionaryField(db_index=True)
    objects = hstore.HStoreManager()
Run Code Online (Sandbox Code Playgroud)

就像是:

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

不起作用,参见 在Django Query中使用.extra(select = {...})引入的值上使用.aggregate()?https://code.djangoproject.com/ticket/11671.

有效的原始SQL如下:

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

如何通过Django的ORM获得相同的结果?

供参考:

Item.objects.extra(select={"key": "content_item.data -> 'key'"})
Run Code Online (Sandbox Code Playgroud)

翻译为:

SELECT (content_item.data -> 'key') AS "key", "content_item"."id", "content_item"."data" FROM "content_item"
Run Code Online (Sandbox Code Playgroud)

Pau*_*ine 7

你尝试过值和order_by吗?

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

在PostgreSQL和Django 1.4中,这样的东西对我有用.

  • 啊哈,聪明,非常感谢!我知道我可以得到一个带有 `values('key')` 的列表,但是尝试在它上面使用 `aggregate` 也失败了。我将不得不花更多的时间来完全理解这些 orm 抽象是如何工作的:) (2认同)