2009-09-06 18 views
14

tôi có:Django: select_related với ManyToManyField

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) 

Làm thế nào tôi có thể có một Alias đó có tất cả của nó achiever_setawards prepopulated?

>>> 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 

Tôi sẽ cần nhiều quyền truy cập vào giải thưởng mà bí danh đã nhận được (cả bảng trung gian và phần thưởng). Làm thế nào tôi có thể bó tất cả những điều này?

Trả lời

21

Phiên bản Django 1.4 trở lên có prefetch_related cho mục đích này.

Phương thức prefetch_related tương tự như select_related, nhưng không thực hiện tham gia cơ sở dữ liệu. Thay vào đó, nó thực hiện các truy vấn cơ sở dữ liệu bổ sung và thực hiện phép nối trong Python.

3

Nếu bạn không ở trên Django 1.4, cũng có thư viện django-batch-select, hoạt động theo cách cơ bản giống như prefetch_related.