Подсчет агрегации в поле jsonb с использованием Django ORM - PullRequest
1 голос
/ 16 июня 2020

Представьте себе модель в Django, например:

class MyModel(models.Model):
        data = JSONField()
        .
        .
        .

Данные хранятся так: {'1':'value1', '2':'value2', '3':'value3', ...}. Ключи данных: ['1', '2', '3', ...].

Цель запроса - подсчитать количество MyModels, которые имеют идентификаторы типа «1» или «2» в ключах данных . Запрос PostgreSql выглядит примерно так:

SELECT jsonb_object_keys(data) AS keys, COUNT(*) AS number FROM MyModel WHERE data ?| array['1','2'] GROUP BY keys

Результат:

keys | number
-----+-------
 '1' |  150
 '2' |  300

Это означает, что есть 150 MyModel, у которых есть '1' в своих данных. keys и 300 MyModels с '2' в ключах данных.

Теперь вопрос: как реализовать запрос с Django?

Учтите, что я знаю способы с MyModels.objects.raw() или connection.cursor() но Ищу решение с Django ORM .

1 Ответ

0 голосов
/ 16 июня 2020

Если вы ищете результаты, которые имеют 1, попробуйте следующее: (и аналогично для 2)

key1_objects = Mymodel.objects.filter(data__has_key='1')

Попробуйте это, чтобы получить результаты, которые включают 1 и исключают 2

key1_objects= Mymodel.objects.filter(data__has_key='1',data__2__isnull=True)

и, чтобы получить результат, который включает 2 и исключает 1

key2_objects= Mymodel.objects.filter(data__has_key='2',data__1__isnull=True)

Конечно, два последних результата не включают объекты, имеющие оба 1 и 2

Если вы уверены, что 1 и 2 независимы и пересечения нет. Не нужно исключать другой ключ, поскольку выбор 1 подразумевает исключение 2

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