Получение определенного поля модели в 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()
, но если вы настаиваете, вы можете добавить его. Не видя вашей модели, трудно сказать.