﻿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
24612	Confusing error message when using only/defer through deleted related field	no		"If one tries to use `defer`/`only` for a field in a model that has the reverse relationship explicitly removed, the resulting error message is confusing.

{{{
#!python
# models.py
from django.db import models
from django.contrib.auth.models import User

class Message(models.Model):
	content = models.CharField(max_length=10)

class MessageParticipant(models.Model):
	msg = models.ForeignKey(Message, related_name='participants')
	user = models.ForeignKey(User, related_name='+')
}}}

Query to reproduce:
{{{
list(Message.objects.all().only('participants__user__username')
}}}

Error:
{{{
Traceback (most recent call last):
  File ""/usr/lib/python3.4/unittest/loader.py"", line 312, in _find_tests
    module = self._get_module_from_name(name)
  File ""/usr/lib/python3.4/unittest/loader.py"", line 290, in _get_module_from_name
    __import__(name)
  File ""~/tmp/sr/test.py"", line 11, in <module>
    print(q.query)
  File ""~/.virtualenvs/dj18_sr/lib/python3.4/site-packages/django/db/models/sql/query.py"", line 213, in __str__
    sql, params = self.sql_with_params()
  File ""~/.virtualenvs/dj18_sr/lib/python3.4/site-packages/django/db/models/sql/query.py"", line 221, in sql_with_params
    return self.get_compiler(DEFAULT_DB_ALIAS).as_sql()
  File ""~/.virtualenvs/dj18_sr/lib/python3.4/site-packages/django/db/models/sql/compiler.py"", line 367, in as_sql
    extra_select, order_by, group_by = self.pre_sql_setup()
  File ""~/.virtualenvs/dj18_sr/lib/python3.4/site-packages/django/db/models/sql/compiler.py"", line 48, in pre_sql_setup
    self.setup_query()
  File ""~/.virtualenvs/dj18_sr/lib/python3.4/site-packages/django/db/models/sql/compiler.py"", line 39, in setup_query
    self.select, self.klass_info, self.annotation_col_map = self.get_select()
  File ""~/.virtualenvs/dj18_sr/lib/python3.4/site-packages/django/db/models/sql/compiler.py"", line 184, in get_select
    for c in self.get_default_columns():
  File ""~/.virtualenvs/dj18_sr/lib/python3.4/site-packages/django/db/models/sql/compiler.py"", line 487, in get_default_columns
    only_load = self.deferred_to_columns()
  File ""~/.virtualenvs/dj18_sr/lib/python3.4/site-packages/django/db/models/sql/compiler.py"", line 755, in deferred_to_columns
    self.query.deferred_to_data(columns, self.query.get_loaded_field_names_cb)
  File ""~/.virtualenvs/dj18_sr/lib/python3.4/site-packages/django/db/models/sql/query.py"", line 622, in deferred_to_data
    cur_model = source.rel.to
AttributeError: 'ManyToOneRel' object has no attribute 'rel'
}}}

Even though the error makes sense once you know why it's happening, I think it would be more helpful to the programmer if the message stated that one cannot use `only`/`defer` on a table/field that has had the reverse relationship removed via `related_name=""+""`"	Cleanup/optimization	closed	Database layer (models, ORM)	1.8	Normal	worksforme			Accepted	0	0	0	0	0	0
