2013-05-21 2 views
1
Class Model(models.Model): 
    ....... 
    ....... 
    ....... 
    ....... 
    first_name = models.CHarField(max_length = 50) 
    last_name = models.CharField(ma_lenghth = 50) 

    def full_name(): 
     return '%s %s' %(self.first_name, self.last_name) 
  • 효율적인 것

또는 장고 모델 최적화

  • Model.objects.filter().values('first_name, 'last_name') 더 나은 것 문자열 나중에 추가 보다

    .

문제는 데이터베이스 최적화에 관해서입니다. 기본적으로 모델의 메서드를 호출하면 전체 개체가로드되는지 아닌지를 알고 싶습니다. 그렇지 않으면 둘 다 동일한 데이터베이스 연산이 발생하지만 전체 개체를 값 메서드보다로드하는 것이 더 나은 최적화라고 생각합니다.

는 회신 해 주시기 바랍니다. 이 주제에 관한 경험이 있거나 경험이 있다면 비교할 수있는 통계를 공유하십시오. 이것은 실제 사례가 아니라 예제이며 모델에는 많은 다른 필드가 포함되어 있습니다. 몇

defer() 또는 only()를 사용하여도 바람직한 결과를 제공한다고 생각된다. 하지만 장고 설명서에서 발견 한 것은 기본적으로 해당 필드 데이터가 python 개체로 변환되는 것이 아니라 sql 조회로 변환되는 것을 방지한다는 것입니다. 그러므로 나는 그것이 더 나아질 것이라고 생각하지 않는다. 도와주세요. 미리 감사드립니다.

답변

0

문제는 그 관련성이 있기 때문에, "모델의 메소드를 호출하면 전체 개체 여부를로드"여부가 아닙니다. "전체 개체 로딩"은 이미 get 호출에 의해 수행되었습니다. 메서드는 해당 호출에 의해 반환 된 모델 객체에 대해 작업하며 달리 지정하지 않으면 (예 : defer 또는 only 사용) 전체 객체가됩니다.

+0

그래서 지연 또는 유일한 값을 사용하기로 동일하게 사용한다 ?? Django 문서에서는 지연 필드가있는 모델을 작성하는 데 약간의 오버 헤드가 있음을 명시합니다. 내가 충분히 이해할 수없는 것은 오버 헤드가 얼마이며, 값을 사용하는 것이 더 나은가하는 것입니다. –

+0

아니요,'defer' /'only'는 메소드를 호출 할 수있는 실제 모델 인스턴스를 제공하지만 일부 필드는 빠져 있습니다. 'values'는 인스턴스가 아닌 사전을 제공하므로 메서드를 호출 할 수 없습니다. 이 시점에서 나는 당신이 지나치게 최적화되었다고 느끼는 것을 도울 수는 없지만 이것이 실제로 병목 현상이라는 것을 확인 했습니까? –

+0

그래서 model.objects.only ('first_name', 'last_name')을 호출하면 get(). full_name()은 values ​​메소드를 호출하는 것과 동일합니다. 하지만이 유일한 방법은 SQL에서 파이썬 개체를 찾는 것이 아니라 SQL에서 파이썬 개체로 변환하는 것을 막는 것입니다. 그래서 나는 그렇게 빠르지 않을 수도 있다고 생각합니다. –

0

get 또는 filter을 사용한 다음 해당 쿼리의 개체에 액세스하면 액세스중인 모델의 필드를 사용하는 경우에만 추가 쿼리가 발생합니다. 예를 들어, 귀하의 경우 해당 필드는 first_namelast_name입니다.

그러나이 경우 다른 당신은 다른 모델에 외부 키를 가지고있다. 해당 모델의 필드에 액세스하려고하면 이전에 작성한 간단한 쿼리가 데이터베이스에서 다른 개체를 가져 오지 못합니다. 따라서 액세스하려고하면 다른 시간에 데이터베이스에 액세스하게됩니다. 이 문제를 해결하려면 select_relatedprefetch_related 설명서를 참조하십시오.

희망이 있습니다.