2012-03-06 133 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

您是想了解Django的ORM,还是想在PHP中复制它?如果这是后者,你看过PHP ORM如Doctrine吗? – 2012-03-06 21:50:55

+1

这里有一些很好的见解https://docs.djangoproject.com/en/dev/topics/db/queries/。顺便说一句我认为FLOW3也有一个ORM。 – Jingo 2012-03-06 21:52:53

+2

不知道幕后的所有内存管理,但至于第二个问题,Django只在使用对象时才调用数据库,就像在循环中一样。你可以输入'p = Person.objects.all()',然后输入p.filter(name =“Paul”)',而且Django还没有打到数据库。一旦你使用了QuerySet,'对于p:...中的p1',它最终命中数据库并获取记录来填充QuerySet对象。 – Furbeenator 2012-03-07 00:16:27

回答

1
  1. Django的读取部分从数据库中的对象,但使一个查询集对象内的高速缓冲存储器。所以如果你已经从queryset中读取完整的数据,将会使用内存。
  2. 所有返回QuerySet的QuerySet方法实际上都会在里面创建一个副本,并且不会将任何缓存复制到新对象中。所以你可以确定queryset总是包含实际的数据,不管它的“父母”或qs本身是否被处理过。
相关问题