Django JSONField, как я могу получить количество вхождений для значений, хранящихся в списке - PullRequest
1 голос
/ 12 октября 2019

База данных 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

размер: L 3 XL 2 S 1

Это возможно ? Что было бы лучшим решением с точки зрения производительности.

Пока мне удалось создать список, содержащий все существующие списки с:

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

color:

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

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

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

1 Ответ

2 голосов
/ 12 октября 2019

Не очень хорошая поддержка для выполнения таких сложных запросов к полям JSON с использованием ORM в Django. Делать это полностью с помощью 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...