2009-09-06 11 views
14

साथ select_related मेरे पास है:Django: 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) 

मैं एक Alias जो सभी ने अपने achiever_set और awards पॉप्यूलेट हो सकती है?

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

इस उद्देश्य के लिए Django संस्करण 1.4 और ऊपर prefetch_related है।

prefetch_related विधि select_related के समान है, लेकिन डेटाबेस में शामिल नहीं है। इसके बजाए, यह अतिरिक्त डेटाबेस प्रश्न निष्पादित करता है और पायथन में शामिल होता है।

3

यदि आप Django 1.4 पर नहीं हैं, तो django-batch-select लाइब्रेरी भी है, जो मूल रूप से prefetch_related जैसा ही काम करता है।

संबंधित मुद्दे