Слишком длинный select при использовании полей JSON

Есть две связанные модели

from django.contrib.postgres.indexes import GinIndex
from django.db import models


class Model(models.Model):
    name = models.CharField(max_length=128, db_index=True)
    attributes = models.JSONField(null=True)
    
    class Meta:
        db_table = 'models'
        indexes = [GinIndex(fields=['attributes'])]

class Offer(models.Model):
    price = models.DecimalField(decimal_places=2, max_digits=8, db_index=True)
    quantity = models.SmallIntegerField()
    model = models.ForeignKey('Model', related_name='offers', on_delete=models.CASCADE)

    class Meta:
        db_table = 'offers'
        indexes = [GinIndex(fields=['attributes'])]

Когда я делаю запросы, используя несколько атрибутов предложения, это занимает много времени. Что не так с этим кодом? У меня в базе данных около 5000 моделей и около 300 000 предложений. Запрос занимает около 20 секунд. Если я использую только один атрибут из предложения, все нормально.

result = (
    Model.objects
    .prefetch_related('offers')
    .filter(attributes__param1='value1')
    .filter(attributes__param2=False)
    .filter(offers__attributes__width='255')
    .filter(offers__attributes__height='55')
    .filter(offers__attributes__diameter='16')
)
Вернуться на верх