Почему не работает индекс на поле json? Django, большая база данных

У меня есть модель в django, в которой есть json-поле, содержащее пищевую ценность блюда.

from django.db import models


class Meal(models.Model):
    name = models.CharField(max_length=200)
    portions_count = models.IntegerField()
    attributes = models.JSONField()

У меня есть миллион записей о блюдах и я хотел бы выполнить поиск на основе атрибутов (gte, lte). Пример поля atrributes:

{"cep": 21.71, "eng": 23.37, "fep": 40.91, "pep": 27.29}

Пример представления:

class MealView(View):
    def get(self, request, *args, **kwargs):
        meals = Meal.objects.filter(attributes__eng__gte=12, attributes__cep__gte=12)[:50]
        return render(request, 'meals.html', {
            'meals': meals
        })

...и более сложные запросы (атрибуты, количество порций и имя вместе).

Запросы могут занимать несколько секунд, а если база данных перегружена, то и больше.

Мы пытались:

GinIndex(fields=['attributes']),

или

Index(fields=['attributes'])

Но индексы не использовались. (проверено в postgres через sql запрос, таблицу pg_stat_all_indexes и explain select)

Я знаю, что было бы определенно лучше, если бы атрибуты не были в JSON. В конечном итоге мы попытаемся изменить это, но в данный момент мы ищем решение на основе JSON.

Вернуться на верх