sql - Django JSONField,如何获取存储在列表中的值的出现次数

标签 sql django postgresql

数据库是postgres 9.4 在我的表中,我使用的是 JSONField

class Item(models.Model):
    item = models.CharField(max_length=200)
    data = JSONField()

示例数据 JSONField 的 3 条记录:

{"color": ["yellow", "blue", "red"], "size": ["S", "L"], "material": "cotton"}

{"color": ["white", "blue", "gray"], "size": ["XL", "L"], "material": "cotton"}

{"color": ["yellow", "gray", "red"], "size": ["L", "XL"], "material": "cotton"}

我的目标是创建一个列表,其中包含每种出现的颜色和大小的计数:

颜色: 黄色 2 蓝色 2 红色 2 灰色 2 白1

尺寸: 大号 3 特大2 1个

这可能吗?什么是性能方面的最佳解决方案。

到目前为止,我设法生成了一个包含所有出现列表的列表:

Item.objects.values_list('data__color').distinct().annotate(num=Count('data_color'))

颜色:

["yellow", "blue", "red"], 1

["white", "blue", "gray"], 1

["yellow", "gray", "red"], 1

最佳答案

在 Django 中使用 ORM 对 JSON 字段执行如此复杂的查询没有很好的支持。完全使用 ORM 来做这件事并不是直截了当的。最好在这里使用原始 sql 查询。在SQL查询方面,可以使用

SELECT jsonb_array_elements(colors::jsonb) as color_count, count(*)
FROM (SELECT meta ->> 'color' as colors
      FROM core_dummymodel) AS tbl
GROUP BY color_count;

获取颜色计数和类似的尺寸查询。

SELECT jsonb_array_elements(sizes::jsonb) as sizes_count, count(*)
from (SELECT meta ->> 'size' as sizes
      FROM core_dummymodel) AS tbl
GROUP BY color_count;

这是颜色的结果:

enter image description here

关于sql - Django JSONField,如何获取存储在列表中的值的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58354606/

相关文章:

python - UpdateView 不使用现有数据填充表单

PostgreSQL 9.5 仅从两个表中选择不匹配的记录

mysql - 为什么许多初创公司在开始时使用 MySQL 或 PostgreSQL 而不是 MongoDB?

SQL获取两个日期之间的工作日数

mysql - 如何选择行和过滤器之间的时间差

django - 新模式关系

python - 使用DOT的带有oAuth2的Django DRF(django-oauth-toolkit)

sql - 使用别名使此 SQL 语句正确

MySQL 5.6 比 MySQL 8 更快

mysql - 查找并显示第二列条目全部重复的所有唯一 ID