2012-03-06 3 views
1

나는 Djangos의 모델 클래스와 비슷한 것을 재현하려고합니다. 어떻게 장고가로드 및 모델 테이블에서 항목을 저장 처리 궁금 해서요. 예를 들어장고는 데이터베이스에서 데이터를 가져 오는 방법을 어떻게 처리합니까?

Person.objects.all() (Person 물론 django.db.models.Model의 서브 클래스 인)를 호출, 나는 장고 예를 들어, SQL 쿼리, SELECT * FROM myapp_person을 수행 할 것으로 예상하고 모델 -의 인스턴스에 쿼리에서 받았다 데이터를 변환 수업. 이 올바른지? 그런 다음

  1. 항목이 너무 많거나 장고가 이러한 부작용을 처리하는 방식으로 메모리 오버플로가 발생할 수 있습니까?
  2. Person.objects.filter(name="Paul")을 호출 할 때 Django가 SELECT * FROM myapp_person WHERE name = 'Paul'과 같은 SQL 쿼리를 수행 할 것으로 예상하지만 이전에 Person.objects.all()이 호출 된 경우 어떻게됩니까? 장고 캐시 또는 그냥 각 호출에 대한 요청을 수행합니까?
+1

Django의 ORM을 이해하려고합니까, 아니면 PHP로 복제 하시겠습니까? 이것이 후자라면 Doctrine과 같은 PHP ORM을 살펴 보았습니까? –

+1

좋은 통찰력은 https://docs.djangoproject.com/en/dev/topics/db/queries/ 여기에 있습니다. Btw 나는 FLOW3도 ORM을 가지고 있다고 생각한다. – Jingo

+2

뒤에서 모든 메모리 관리에 대해 확신 할 수는 없지만 두 번째 질문에 대해서는 장고와 같이 객체를 사용할 때만 장고가 데이터베이스를 호출합니다. 'p = Person.objects.all()'다음에'p.filter (name = "Paul")'을 입력 할 수 있습니다. 아직 Django는 데이터베이스에 접근하지 않았습니다. 일단 당신이 QuerySet을 사용하면,'p1에서 p : ... '로 마침내 데이터베이스를 조회하고 레코드를 가져 와서 QuerySet 객체를 채 웁니다. – Furbeenator

답변

1
  1. 장고 부에 데이터베이스에서 객체를 판독하고 있지만, 검색어 세트 오브젝트 내부 캐시한다. 따라서 쿼리 세트에서 전체 데이터를 읽은 경우 메모리가 사용됩니다.
  2. QuerySet을 반환하는 모든 QuerySet 메소드는 실제로 그 내부 복사본을 만들고 새 객체에 캐시를 복사하지 않습니다. 따라서 "부모"또는 qs 자체가 처리되었는지 여부에 관계없이 queryset에 항상 실제 데이터가 포함되어 있는지 확인할 수 있습니다.
관련 문제