Предварительная загрузка отношения 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

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