2009-09-06 2 views
14

내가 가지고있는 것 :장고 : ManyToManyField와 select_related

class Award(models.Model) : 
    name = models.CharField(max_length=100, db_index=True) 

class Alias(models.Model) : 
    awards = models.ManyToManyField('Award', through='Achiever') 

class Achiever(models.Model): 
    award = models.ForeignKey(Award) 
    alias = models.ForeignKey(Alias) 
    count = models.IntegerField(default=1) 

어떻게 그것의 achiever_setawards가 모두 미리 채워져있는 Alias를 가질 수 있습니까?

>>> db.reset_queries() 
>>> Alias.objects.filter(id="450867").select_related("achiever_set__award").get().achiever_set.all()[0].award.name 
u'Perma-Peddle' 
>>> len(db.connection.queries) 
3 
>>> db.reset_queries() 
>>> Alias.objects.filter(id="450867").select_related("awards").get().awards.all()[0].name 
u'Dwarfageddon (10 player)' 
>>> len(db.connection.queries) 
2 

별칭이 이미 확보 된 상 (수상 테이블과 수상 경력 모두)에 대한 액세스 권한이 많이 필요합니다. 이 모든 것을 어떻게 배치 할 수 있습니까?

답변

21

장고 버전 1.4 이상은이 목적으로 prefetch_related입니다.

prefetch_related 메서드는 select_related과 유사하지만 데이터베이스 조인을 수행하지 않습니다. 대신 추가 데이터베이스 쿼리를 실행하고 Python으로 결합합니다.

3

장고 1.4가 없다면 django-batch-select 라이브러리가 있습니다.이 라이브러리는 기본적으로 prefetch_related와 같은 방식으로 작동합니다.