Имею модель 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 запроса к базе
А в случае оптимизации select_relate Django сгенерирует общий SQL запрос с использованием JOIN и в результате получите свой единственный запрос к таблице.
Если используется представление на основе базовых классов то нужно переопределять queryset с помощью get_queryset
Комментариев 0