﻿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 <ara818@…>	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
