2012-03-06 129 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本身是否被處理過。
相關問題