2016-06-28 4 views
0

을 통해 정의와 쿼리 나는이 개 모델을 가지고 :최적화 장고 대다 테이블

class ModelA: 
    fieldA = models.ManyToManyField(ModelB, through="CustomThroughTable") 

    def foobar(self): 
     return self.fieldA.through.objects.filter(fieldA=self) 

class ModelB: 
    whatever = models.CharField() 

나는 통해 테이블에 fieldA의 모든 값을 출력 할 ModelA의 기능을 구현하고 싶습니다. foobar 함수의 현재 구현은 지금 당장 필요한 것이지만 오히려 비효율적이라고 생각합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 감사.

+0

왜 비효율적이라고 생각합니까? –

+0

나는'debug_toolbar'를 사용하여 만들어진 SQL 쿼리의 수를 세지 만,이 함수가 기존 레코드의 수보다 길어서이 함수가 범인이라고 생각하게되었습니다. – 7ball

답변

1

나는 그 쿼리에 대해 비효율적 인 것을 보지 못한다. 문제를 더 정확하게 디버깅해야 할 것이다.

그렇다면 관통 테이블에서 관련 이름을 사용하면 더 간단하고 (동일하게 효율적으로) 동일한 결과를 얻을 수 있습니다.

class ModelA(models.Model): 
    fieldA = models.ManyToManyField(ModelB, through="CustomThroughTable") 

class ModelB(models.Model): 
    whatever = models.CharField() 

class CustomThroughTable(models.Model): 
    modela = models.ForeignKey(ModelA, related_name="foobar") 
    modelb = models.ForeignKey(ModelB)