Стоит ли использовать `select_related()` при использовании только одного экземпляра модели вместо кверисета?
Я буду краток. Допустим, у нас есть такая структура базы данных:
class Bird(models.Model):
name = models.CharField()
specie = models.CharField()
class Feather(models.Model):
bird = models.ForeignKey(Bird)
Затем у нас есть несколько простых строк из APIView
:
feather_id = request.query_params['feather']
feather = Feather.objects.get(pk=feather_id)
bird_name = feather.bird.name
# a lot of lines between
bird_specie = feather.bird.specie
Есть ли разница при использовании:
feather = Feather.objects.select_related('bird').get(pk=1)
вместо:
feather = Feather.objects.get(pk=1)
в этом сценарии? Я видел, что некоторые люди используют select_prefetch()
таким образом, и мне интересно, есть ли разница, если нет, то какой из них следует использовать? Обычно я согласен, что select_prefetch()
полезен для оптимизации при использовании кверисетов, чтобы избежать запроса каждого экземпляра в отдельности, но в данном случае, стоит ли его использовать, когда у вас всего один экземпляр в целом APIView
?
На мой взгляд, разница лишь в том, что позже делается еще один запрос, но если говорить о производительности, то она одинакова.
Заранее спасибо.
Да, это будет иметь значение, но, вероятно, это будет оченьмаленькое значение. Одновременный выбор связанных таблиц устраняет время, необходимое для дополнительных обращений к базе данных, скорее всего, на несколько миллисекунд.
Это может иметь значение только в том случае, если у вас большая задержка при подключении к базе данных, есть много связанных таблиц, которые будут извлекаться по очереди, и/или apiview имеет очень высокую нагрузку (и каждая миллисекунда на счету).
Я обычно использую select_related()
в запросах к одному объекту, но скорее как стилистический выбор, чем как выбор производительности: чтобы указать, какие другие модели будут извлечены и использованы (явные лучше, чем неявные).