【问题标题】:Django JSONField, how can i get the count of occurences for values stored in a listDjango JSONField,我如何获取存储在列表中的值的出现次数
【发布时间】:2020-02-09 18:28:18
【问题描述】:

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

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

3 条记录的示例数据 JSONField:

{"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 S 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

【问题讨论】:

标签: sql django postgresql


【解决方案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;

这是颜色的结果:

【讨论】:

  • 在纯 SQL 中它可以工作,但使用 Django 的 raw() 管理器会给出错误:'原始查询必须包含主键'
  • 你查询的怎么样了?你能把它贴在评论里吗?
  • query = "SELECT jsonb_array_elements(color::jsonb) as color_count, count(*) FROM(SELECT jsdata ->> 'color' as color FROM wb_item WHERE price > 0) AS tbl GROUP BY color_count ;" qs = Item.objects.raw(query)
  • 只需在您的 select 语句中包含 1 as id, 即可。所以把你的查询改成query = "SELECT 1 as id, jsonb_array_elements(color::jsonb) as color_count, count(*) FROM(SELECT jsdata ->> 'color' as color FROM wb_item WHERE price > 0) AS tbl GROUP BY color_count ;"
  • 仍然无法让它工作。使用 connection.cursor() 从数据中获取我的数据绝对是更复杂查询的方法。再次感谢。
猜你喜欢
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 2020-10-16
  • 1970-01-01
相关资源
最近更新 更多