Django использование select_related для оптимизации работы

Имею модель fk.Archive на которую ссылаются несколько других моделей из разных приложений, с помощью аттрибута related_name указываю связь

#
class Archive(models.Model):
    short_name = models.CharField(max_length=50L, verbose_name='короткое название' )

class Fond(models.Model):
    archive = models.ForeignKey(Archive, verbose_name='архив', null=True, related_name='fond')
    fkod = models.CharField('номер',max_length=8L)

class Request(models.Model):
    crt_date = models.DateField('создание', editable=False, auto_now_add=True)
    archive = models.ForeignKey(Archive, verbose_name='архив', null=True, related_name='request')

затем используются в разных представлениях с использованием select_related

#
def fond_list(request):
    fond_list = Fond.objects.using('default').select_related("archive")
    context = {'fond_list': fond_list, }
    return render(request, 'ensa-fond.html', context)

def request_index(request):
    table = RequestTable(Request.objects.select_related("archive"))
    RequestConfig(request).configure(table)
    return render(request, 'request.html', {'request_list2': table})

class RequestIndex(ListView):
    template_name = "request.html"
    context_object_name = "request_list"
    def get_queryset(self):
        return Request.objects.select_related("archive")

зачем это нужно? Дело в том, что когда django генерируя шаблон выполняет запросы к таблица Fond и Reques, а затем расчитывает значение поля archive, то при генерации каждой новой строки будет выполнен новый sql запрос к таблице archive. Итого, если вы выводите табличку в 20 записей то как минимум получите 24 запроса к базе

оптимизация Django запросов с использование select_related

А в случае оптимизации select_relate Django сгенерирует общий SQL запрос с использованием JOIN и в результате получите свой единственный запрос к таблице.

Если используется представление на основе базовых классов то нужно переопределять queryset с помощью get_queryset

Комментариев 0
Нужна авторизация с помощью
Об авторе
Илья Илья

меня можно найти тут