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

#
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, а затем вычисляет значение поля архива. Затем к архивной таблице запускается новый SQL-запрос по мере создания каждой новой строки. Если вы отобразите таблицу с 20 общими записями, вы получите как минимум 24 запроса к базе данных.

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

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

Source

ЧИТАТЬ  Партнеры РСЯ смогут регулировать количество показов блоков Floor Ad и Top Ad.