Как аннотировать счет на основе вложенного JSONField в Django 1.11 и postgres 9.6 - PullRequest
0 голосов
/ 27 ноября 2018

Моя модель в настоящее время выглядит следующим образом:

class Review(models.Model):
      source = models.CharField(max_length=80, blank=True, null=True)
      metadata = JSONField(default=dict)
      entity_type = models.CharField(max_length=255, blank=True, null=True)

Пример набора запросов класса Review:

[{
  "id": 123,
  "source": "amazon",
  "entity_type": "media",
  "metadata": [
    {
      "product": 123456
    },
    {
      "product": 012345
    }
  ]
},
{
  "id": 1234,
  "source": "amazon",
  "entity_type": "media",
  "metadata": [
    {
      "product": 123456
    },
    {
      "product": 12345
    }
  ]
}]

Я хочу аннотировать счет на основе «source», «entity_type», «metadata_product»"

Я говорю о запросе Django, похожем на:

Review.objects.filter().values(
 "source","entity_type","metadata__product"
).annotate(count=Count('id'))

, который, очевидно, не будет работать.

Я хочу получить набор выходных запросов, аналогичный:

[{"source": "amazon", "entity_type": "media", "metadata_product":
  123456, "count": 2}, 
 {"source": "amazon", "entity_type": "media","metadata_product":
  012345, "count": 1},
 {"source": "amazon", "entity_type": "media","metadata_product":
  12345, "count": 1}]

Я хочу добиться этого с помощью Django ORM и не прибегать к python, потому что таблица содержит данные, близкие к 10 или 20 миллионам.Если это невозможно, будет действительно хорошо, если кто-то может предложить необработанный SQL-запрос, который можно поместить в метод Django ORM raw SQL.

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