id,summary,reporter,owner,description,type,status,component,version,severity,resolution,keywords,cc,stage,has_patch,needs_docs,needs_tests,needs_better_patch,easy,ui_ux 14887,select_related() does not work with Proxy models and multi-table inheritance,Ara Anjargolian ,nobody,"Consider the following models {{{ class TumbleItem(models.Model): tumblr_id = models.CharField(max_length=64, editable=False, null=True) pub_date = models.DateTimeField(default=datetime.datetime.now) format = models.CharField(max_length=10, choices=FORMAT_CHOICES, default='html') display_status = models.CharField(max_length=10, choices=DISPLAY_STATUS_CHOICES, default='public') tags = TaggableManager() # this is for magic later and makes doing lookups both easier and lazier. content_type = models.ForeignKey(ContentType, editable=False, null=True) object_id = models.PositiveIntegerField(db_index=True, editable=False, null=True) object = generic.GenericForeignKey(ct_field=""content_type"", fk_field=""object_id"") class Regular(TumbleItem): title = models.CharField(max_length=250, blank=True) body = models.TextField() class StoryItem(TumbleItem): class Meta: proxy = True def _slug(self): ''' strip out extra punctuation and create a slug ''' slug = '' if self.object.title != '': slug = base.get_base_term(self.object.title) return slug slug = property(_slug) }}} To access data stored in Regular efficiently, a select_related would be useful. While a select_related has the expected behavior when using TumbleItem, using the proxy model StoryItem it breaks. I would expect them to have the exact same behavior. See below {{{ >>> print TumbleItem.objects.select_related('regular').query SELECT `djumblr_tumbleitem`.`id`, `djumblr_tumbleitem`.`tumblr_id`, `djumblr_tumbleitem`.`pub_date`, `djumblr_tumbleitem`.`format`, `djumblr_tumbleitem`.`display_status`, `djumblr_tumbleitem`.`content_type_id`, `djumblr_tumbleitem`.`object_id`, `djumblr_regular`.`tumbleitem_ptr_id`, `djumblr_regular`.`title`, `djumblr_regular`.`body` FROM `djumblr_tumbleitem` LEFT OUTER JOIN `djumblr_regular` ON (`djumblr_tumbleitem`.`id` = `djumblr_regular`.`tumbleitem_ptr_id`) ORDER BY `djumblr_tumbleitem`.`pub_date` DESC >>> print StoryItem.objects.select_related('regular').query SELECT `djumblr_tumbleitem`.`id`, `djumblr_tumbleitem`.`tumblr_id`, `djumblr_tumbleitem`.`pub_date`, `djumblr_tumbleitem`.`format`, `djumblr_tumbleitem`.`display_status`, `djumblr_tumbleitem`.`content_type_id`, `djumblr_tumbleitem`.`object_id` FROM `djumblr_tumbleitem` ORDER BY `djumblr_tumbleitem`.`pub_date` DESC }}}",New feature,closed,"Database layer (models, ORM)",1.2,Normal,duplicate,proxy select_related inheritance,flisky,Accepted,0,0,0,0,0,0