Как django обрабатывает получение данных из базы данных? - PullRequest
1 голос
/ 07 марта 2012

Я пытаюсь воспроизвести что-то похожее на класс Model Djangos в PHP. Мне было интересно, как django обрабатывает загрузку и сохранение записей из таблицы моделей.

Например, при вызове Person.objects.all() (Person, конечно, подкласс django.db.models.Model), я ожидаю, что Django выполнит SQL-запрос, например, SELECT * FROM myapp_person, а затем преобразует данные, полученные из запрос к экземплярам Model-класса. Это правильно? Тогда,

  1. Может ли это привести к переполнению памяти, когда слишком много записей, или есть способ, которым Django обрабатывает этот побочный эффект?
  2. При вызове Person.objects.filter(name="Paul") я ожидаю, что Django выполнит SQL-запрос наподобие SELECT * FROM myapp_person WHERE name = 'Paul', но что, если Person.objects.all() был вызван раньше? Кеширует ли их django или выполняет запрос для каждого вызова?

1 Ответ

1 голос
/ 07 марта 2012
  1. Django читает объекты из базы данных по частям, но создает кеш внутри объекта QuerySet. Поэтому, если вы прочитали все данные из набора запросов, будет использована память.
  2. Все методы QuerySet, которые возвращают QuerySets, фактически делают его копию внутри и не копируют кеш в новый объект. Таким образом, вы можете быть уверены, что набор запросов всегда содержит фактические данные, независимо от того, был ли обработан какой-либо из его «родителей» или самого qs.
...