﻿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
10086	select_related and annotate weird behaviour	panni@…	nobody	"Considering the following Models:
{{{
class BlogEntry(models.Model):
    user = models.ForeignKey(User, related_name=""BlogEntryUser"")
    datetime = models.DateTimeField(auto_now_add=True)
    datetimeModified = models.DateTimeField(null=True, blank=True)
    title = models.CharField(max_length=255)
    titleSlug = models.SlugField(editable=False)
    text = models.TextField()
    hitCount = models.IntegerField(""Zugriffe"", default=0, blank=True, null=True, editable=False)
    visitors = models.ManyToManyField(User, null=True, blank=True, related_name=""BlogEntryVisitorsUser"")

class BlogEntryComment(models.Model):
    comment = models.ForeignKey(Comment, verbose_name=""Comment"", related_name=""BlogEntryCommentComment"")
    motherModel = models.ForeignKey(BlogEntry, verbose_name=""Blog Eintrag"", related_name=""BlogEntryCommentBlogEntry"")

class Comment(models.Model):
    text     = models.TextField(""Inhalt"")
    author   = models.ForeignKey(User, related_name=""CommentAuthorUser"", verbose_name=""Autor"")
    datetime = models.DateTimeField(""Geschrieben um"", editable=False)
    lastedit = models.DateTimeField(""Zuletzt editiert am"", editable=False, null=True, blank=True)
    lastedit_by = models.ForeignKey(User, related_name=""CommentLastEditUser"", verbose_name=""Autor"", editable=False, null=True, blank=True)
}}}

# Using the following annotated query:
lastWeek = datetime.date.today() - datetime.timedelta(days=7)
bestBlogs = BlogEntry.objects.select_related(""user"", ""BlogEntryCommentBlogEntry__comment"", ""BlogEntryCommentBlogEntry__comment__author"").filter(datetime__gte = lastWeek).annotate(Count(""BlogEntryCommentBlogEntry"")).order_by(""-BlogEntryCommentBlogEntry__count"")[:settings.NUM_HOME_SIDEBAR_COMMUNITY_TOPBLOGS]

# then doing
print dir(bestBlogs[0].user), bestBlogs[0].user.username

# results in
['AdminNoticeUser', 'AdminUserNoteUser', 'BlogEntryUser', 'BlogEntryVisitorsUser', 'CommentAuthorUser', 'CommentLastEditUser', 'DoesNotExist', 'ForumThreadUser', 'MultipleObjectsReturned', 'PickRoomClient1User', 'PickRoomClient2User', 'PickRoomMasterCreator', 'PickRoomMasterUser', 'PlayerFanClubMemberUser', 'PublicGalleryItems', 'TeamFanClubMemberUser', 'UserBetUser', 'UserFlatPage', 'UserNoteAdmin', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__unicode__', '__weakref__', '_collect_sub_objects', '_default_manager', '_get_FIELD_display', '_get_next_or_previous_by_FIELD', '_get_next_or_previous_in_order', '_get_pk_val', '_meta', '_set_pk_val', 'article_set', 'check_password', 'date_joined', 'delete', 'email', 'email_user', 'first_name', 'get_absolute_url', 'get_all_permissions', 'get_and_delete_messages', 'get_full_name', 'get_group_permissions', 'get_next_by_date_joined', 'get_next_by_last_login', 'get_previous_by_date_joined', 'get_previous_by_last_login', 'get_profile', 'groups', 'has_module_perms', 'has_perm', 'has_perms', 'has_usable_password', 'id', 'is_active', 'is_anonymous', 'is_authenticated', 'is_staff', 'is_superuser', 'last_login', 'last_name', 'logentry_set', 'message_set', 'objects', 'password', 'pk', 'registrationprofile_set', 'save', 'save_base', 'serializable_value', 'set_password', 'set_unusable_password', 'user_permissions', 'username', 'userprofile_set'] 3

Notice the ""3"" in user.username.

Issuing the query without ""user"" in the select_related() clause results in:
['AdminNoticeUser', 'AdminUserNoteUser', 'BlogEntryUser', 'BlogEntryVisitorsUser', 'CommentAuthorUser', 'CommentLastEditUser', 'DoesNotExist', 'ForumThreadUser', 'MultipleObjectsReturned', 'PickRoomClient1User', 'PickRoomClient2User', 'PickRoomMasterCreator', 'PickRoomMasterUser', 'PlayerFanClubMemberUser', 'PublicGalleryItems', 'TeamFanClubMemberUser', 'UserBetUser', 'UserFlatPage', 'UserNoteAdmin', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__unicode__', '__weakref__', '_collect_sub_objects', '_default_manager', '_get_FIELD_display', '_get_next_or_previous_by_FIELD', '_get_next_or_previous_in_order', '_get_pk_val', '_meta', '_set_pk_val', 'article_set', 'check_password', 'date_joined', 'delete', 'email', 'email_user', 'first_name', 'get_absolute_url', 'get_all_permissions', 'get_and_delete_messages', 'get_full_name', 'get_group_permissions', 'get_next_by_date_joined', 'get_next_by_last_login', 'get_previous_by_date_joined', 'get_previous_by_last_login', 'get_profile', 'groups', 'has_module_perms', 'has_perm', 'has_perms', 'has_usable_password', 'id', 'is_active', 'is_anonymous', 'is_authenticated', 'is_staff', 'is_superuser', 'last_login', 'last_name', 'logentry_set', 'message_set', 'objects', 'password', 'pk', 'registrationprofile_set', 'save', 'save_base', 'serializable_value', 'set_password', 'set_unusable_password', 'user_permissions', 'username', 'userprofile_set'] Rudi

Notice the real username returned"		closed	Database layer (models, ORM)	dev		duplicate	select_related,annotate		Unreviewed	0	0	0	0	0	0
