У меня есть модель 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