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