Оптимизирует ли Django запрос, если он выполняется несколько раз с одним и тем же фильтром?

class MyModel(models.Model):
    task_id = models.UUIDField()
    task_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, related_name='+')
    task = GenericForeignKey('task_type', 'task_id')
    .....


    @property
    def task_description(self):
        if self.task_status === 'pending':
            return 'Pending Task'
        else:
            task = Task.objects.filter(self.task_id).first()
            return task.name or ''

В случае, если self.task_status не pending, то для каждой задачи она ищет название в таблице Task.

Мой вопрос.

  1. предположим идентификаторы задач [1,2,3,3,3] тогда какие запросы будут выполняться ?
  2. это N+1 задача?
  3. для id
  4. проверяет таблицу Task, где id = 1. Для 2 3 тоже проверяет. Но для 1 он просматривает таблицу 3 раза с тем же фильтром, как id == 3 ? where id = 3
    1. Поскольку вы используете общие внешние ключи, для каждого поиска может выполняться несколько запросов. Я бы рекомендовал использовать django-polymorphic вместо этого, если вам нужно истинное наследование моделей (различные модели для различных типов задач с общим базовым классом).
    2. .
    3. Да, обращение к task_description для N MyModels, которые не являются pending, будет делать N дополнительных запросов.
    4. Да, это так. Эти поиски происходят изолированно, поэтому для 5 моделей MyModel вы получите 5 запросов.
    5. .
    Вернуться на верх