Django ORM & hstore:计算键的唯一值
Posted
技术标签:
【中文标题】Django ORM & hstore:计算键的唯一值【英文标题】:Django ORM & hstore : counting unique values of a key 【发布时间】:2012-09-13 10:18:54 【问题描述】:具有以下模型:
from django_hstore import hstore
from django.db import models
class Item(VoteModel):
data = hstore.DictionaryField(db_index=True)
objects = hstore.HStoreManager()
类似:
Item.objects.extra(select="key": "content_item.data -> 'key'").aggregate(Count('key'))
不起作用,参见。 Using .aggregate() on a value introduced using .extra(select=...) in a Django Query? 和 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)
如何通过 Django 的 ORM 获得相同的结果?
仅供参考:
Item.objects.extra(select="key": "content_item.data -> 'key'")
翻译为:
SELECT (content_item.data -> 'key') AS "key", "content_item"."id", "content_item"."data" FROM "content_item"
【问题讨论】:
【参考方案1】:你尝试过 values 和 order_by 吗?
Item.objects.extra(
select=dict(key = "content_item.data -> 'key'")
).values('key').order_by('key').annotate(total=Count('key'))
这样的东西在 PostgreSQL 和 Django 1.4 中对我有用。
【讨论】:
啊哈,聪明,非常感谢!我知道我可以得到一个带有values('key')
的列表,但尝试在上面使用aggregate
也失败了。我将不得不花更多的时间来完全理解这些 orm 抽象是如何工作的 :)
@MaximeR.:由于“管理员”应用程序对 ORM 的依赖,我不得不吞下它,但恕我直言,ORM 是 Django 框架中最弱的组件。我梦想有人使用 Flask、SQLAlchemy 和 Jinja2 克隆 Django 管理应用程序。
@AlexK: 对我来说django.contrib.admin
是一个杀手级应用程序(不是 Django 本身),我应该抽出一些时间来制作一个与任何特定 ORM 解耦的克隆。以上是关于Django ORM & hstore:计算键的唯一值的主要内容,如果未能解决你的问题,请参考以下文章
Django HStore:如何覆盖键值模型字段的 __getattr__ 和 __setattr__