Предварительная загрузка отношения FK в разные колонки Django
У меня есть модели Django, которые выглядят так
class Customer(models.Model):
name = models.CharField(_("Name"))
class Feature(models.Model):
label = models.CharField(_("Name"))
class AddOn(models.Model):
customer = models.ForeignKey(Customer)
feature = models.ForeignKey(Feature)
Учитывая, что у меня есть экземпляр Customer e.g
customer = Customer.objects.get(pk=1)
Как получить все метки в функции в одном запросе, чтобы избежать N+1 запроса?
На данный момент я сделал следующее:
[addon.feature.label for addon in self.addon_set.all()]
Но я думаю, что для каждого addon.feature будет создан запрос, который не очень оптимизирован, если есть много аддонов
Вы можете использовать values/values_list для получения всех меток в одном запросе
self.addon_set.values_list('feature__label', flat=True)
EDIT: Пример поля ManyToManyField
class Customer(models.Model):
name = models.CharField(_("Name"))
features = ManyToManyField('Feature', through='AddOn')
class Feature(models.Model):
label = models.CharField(_("Name"))
class AddOn(models.Model):
customer = models.ForeignKey(Customer)
feature = models.ForeignKey(Feature)
Вы можете выполнять запросы типа customer_obj.features.all() или feature_obj.customers.all(), и это не повлияет на вашу способность выполнять запросы к модели AddOn