Django аннотирует двойной вложенный ключ в JSONField

Мое JSONField содержит такие данные:

class Car(models.Model):
   data = JSONField()
Car.objects.first().data

{
    u'colors': [
        {u'color_id': u'1', u'source': u'Manufacturer 3'},
        {u'color_id': u'2', u'source': u'Manufacturer 2'},
        {u'color_id': u'3', u'source': u'Manufacturer 1'},
    ]
}

Я знаю, что могу фильтровать результаты с помощью:

Car.objects.filter(data__colors__contains=[{'color_id':'3'}])

Есть ли способ аннотировать queryset так, чтобы 'color_id' содержались в списке? Что-то вроде:

Car.objects.all().annotate(color_ids=...)

Это позволит мне сделать:

Car.objects.first().color_ids
['3', '2', '1']

Или что-то в этом роде, только для фильтрации по значению color_id. Использую Django 1.11 и Postgres 13.

Думаю, вы можете использовать KeyTransform для получения json-значения и ArrayAgg() для получения списка:

from django.contrib.postgres.fields.jsonb import KeyTransform

Car.objects.annotate(colors=KeyTransform("data", "colors")).annotate(color_id=KeyTransform("colors", "color_id")).annotate(colors_ids=ArrayAgg('color_id'))
Вернуться на верх