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 запроса к базе
А в случае оптимизации select_relate Django сгенерирует общий SQL запрос с использованием JOIN и в результате получите свой единственный запрос к таблице.
Если используется представление на основе базовых классов то нужно переопределять queryset с помощью get_queryset
текст недоступен
другие страницы раздела
- C/C++: Разбор параметров командной строки - unistd.h :: getopt
- С/C++: libconfig - библиотека для обработки конфигурационных файлов
- Python: strip split join
- jQuery: простые примеры
- python: работа со строками и словарями, формирование sql запросов
- Выбор платформы для презентаций
- Пакетная обработка DBF Foxpro файлов, Import в FoxPRO
- Расширение Firefox собственным Меню -- это очень просто
- Разработка открытой альтернативы закрытому отраслевому ПО "Архивный Фонд"
- Linux Django pyodbc MSSQL
- Sqlite3 работа с несколькими базами
- python ProxyError
- Python: сортировка списков
- Flask.admin FileAdmin проблема с локалями
- Flask restful сериализация sqlalchemy моделей в Json поток
комментарии