【问题标题】:Django ORM & hstore : counting unique values of a keyDjango ORM & hstore:计算键的唯一值
【发布时间】: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"

【问题讨论】:

    标签: python django postgresql orm hstore


    【解决方案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 解耦的克隆。
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2014-04-07
    • 2010-12-13
    相关资源
    最近更新 更多