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

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