2012-03-06 11 views
1

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

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

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

Вы пытаетесь понять ORM Django, или хотите реплицировать его на PHP? Если это последнее, вы посмотрели на PHP ORM, например Doctrine? –

+1

Здесь есть некоторые полезные сведения: https://docs.djangoproject.com/en/dev/topics/db/queries/. Кстати, я думаю, что FLOW3 имеет ORM. – Jingo

+2

Не уверен во всем управлении памятью за кулисами, но что касается вашего второго вопроса, Django только делает вызов в базу данных, когда объекты используются, как в цикле. Вы можете ввести 'p = Person.objects.all()' then 'p.filter (name =" Paul ")', и до сих пор Django не попал в базу данных. Когда вы используете QuerySet, 'для p1 в p: ...' он, наконец, попадает в базу данных и получает записи для заполнения объекта QuerySet. – Furbeenator

ответ

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