﻿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
10913	Document how related_name affects QuerySet filtering	neithere	Tim Graham	"The documentation [http://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects states] that by default the ""backward"" relationship Manager ''""is named {{{FOO_set}}}, where {{{FOO}}} is the source model name, lowercased""''. However, in the latest SVN snapshot the behaviour seems to be inconsistent.

'''models.py'''

{{{
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=255)

class Book(models.Model):
    title  = models.CharField(max_length=255)
    author = models.ForeignKey(Author)         # by default, related_name='book_set'

}}}

The {{{related_name}}} argument is commented out. If not, everything works fine, but let's see what happens now:

'''In shell after syncdb:'''

{{{
>>> from fooapp.models import Author, Book
>>> Author.book_set
<django.db.models.fields.related.ForeignRelatedObjectsDescriptor object at 0x27f4e90>
>>> Author.book
Traceback (most recent call last):
  File ""<console>"", line 1, in <module>
AttributeError: type object 'Author' has no attribute 'book'
>>> a=Author.objects.create(name='John')
>>> b=Book.objects.create(title='My Book', author=a)
>>> Author.objects.filter(book_set__exact=1)
Traceback (most recent call last):
  File ""<console>"", line 1, in <module>
  File ""/usr/local/lib/python2.6/dist-packages/Django-1.1_beta_1-py2.6.egg/django/db/models/manager.py"", line 129, in filter
    return self.get_query_set().filter(*args, **kwargs)
  File ""/usr/local/lib/python2.6/dist-packages/Django-1.1_beta_1-py2.6.egg/django/db/models/query.py"", line 466, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File ""/usr/local/lib/python2.6/dist-packages/Django-1.1_beta_1-py2.6.egg/django/db/models/query.py"", line 484, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File ""/usr/local/lib/python2.6/dist-packages/Django-1.1_beta_1-py2.6.egg/django/db/models/sql/query.py"", line 1613, in add_q
    can_reuse=used_aliases)
  File ""/usr/local/lib/python2.6/dist-packages/Django-1.1_beta_1-py2.6.egg/django/db/models/sql/query.py"", line 1511, in add_filter
    negate=negate, process_extras=process_extras)
  File ""/usr/local/lib/python2.6/dist-packages/Django-1.1_beta_1-py2.6.egg/django/db/models/sql/query.py"", line 1676, in setup_joins
    ""Choices are: %s"" % (name, "", "".join(names)))
FieldError: Cannot resolve keyword 'book_set' into field. Choices are: book, id, name
>>> Author.objects.filter(book__exact=1)
[<Author: John>]
}}}"	Cleanup/optimization	closed	Documentation	dev	Normal	fixed	orm, related_name,	greg@…	Accepted	0	1	0	0	0	0
