Получение определенного поля модели в select_related

В моем проекте есть запрос:

qs = self.model.objects \
            .filter(user=self.request.user, pk__iexact=pk) \
            .select_related('shipping_addr', 'billing_addr', 'cart') \
            .first()

Я хочу оптимизировать этот запрос больше, чем он есть. Я хочу получить только поля 'id' и 'name' из shipping_addr. Но это не работает:

qs = self.model.objects \
                .filter(user=self.request.user, pk__iexact=pk) \
                .select_related('shipping_addr', 'billing_addr', 'cart') \
                .only('shipping_addr__name','shipping_addr__id') \
                .first()

Я знаю причину, по которой этот код не выполняется, я не знаю, что мне нужно сделать😕.

select_related() ограничено однозначными отношениями - внешний ключ и один-к-одному. См: https://docs.djangoproject.com/en/3.1/ref/models/querysets/#select-related

Поэтому он должен начинаться в модели, которая имеет внешний ключ, а затем вы можете выбрать связанный родительский объект, который также будет извлечен. Таким образом, ваш self.model имеет внешний ключ к shipping_addr.

Вы хотите получить shipping_addr.name, сохранив дополнительный хит базы данных, потому что

object=self.model.objects.get(pk=pk)
shipping_address_name=object.shipping_addr.name

дважды попадает в ваш БД. Поэтому, вместо этого, вы делаете:

object=self.model.objects.select_related('shipping_addr').get(pk=pk)
shipping_address_name = object.shipping_addr.name

Таким образом, вы исключили один удар по базе данных, потому что ваш объект будет извлечен из базы данных уже включая shipping_addr.

Если только ваш shipping_addr не имеет много полей или очень дорогих для извлечения, я бы не стал беспокоиться об использовании only(), но если вы настаиваете, вы можете добавить его. Не видя вашей модели, трудно сказать.

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