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'))