#24936: AttributeError appears when one tries to use defer/only for a field in a
model that has the reverse relationship explicitly removed
----------------------------------------------+--------------------
     Reporter:  lukawoj                       |      Owner:  nobody
         Type:  Bug                           |     Status:  new
    Component:  Database layer (models, ORM)  |    Version:  master
     Severity:  Normal                        |   Keywords:
 Triage Stage:  Unreviewed                    |  Has patch:  0
Easy pickings:  0                             |      UI/UX:  0
----------------------------------------------+--------------------
 While investigating #24612 I discovered that if one tries to use
 defer/only for a field in a model that has the reverse relationship
 explicitly removed, AttributeError appears. Code changed since #24612 was
 logged and now it throws following error:
 {{{
 AttributeError: 'ManyToOneRel' object has no attribute 'attname'
 }}}

 Models:
 {{{
 #!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 use:
 {{{
 list(Message.objects.all().only('participants__user__username'))
 }}}

 Error:
 {{{
 Traceback (most recent call last):
   File
 
"C:/dev/django_con/django_sprint_2015/django_sprint/django/tests\defer\tests.py",
 line 279, in test_defer_only
     list(Message.objects.all().only('participants__user__username'))
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\query.py",
 line 258, in __iter__
     self._fetch_all()
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\query.py",
 line 1063, in _fetch_all
     self._result_cache = list(self.iterator())
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\query.py",
 line 52, in __iter__
     results = compiler.execute_sql()
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\sql\compiler.py",
 line 835, in execute_sql
     sql, params = self.as_sql()
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\sql\compiler.py",
 line 384, in as_sql
     extra_select, order_by, group_by = self.pre_sql_setup()
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\sql\compiler.py",
 line 48, in pre_sql_setup
     self.setup_query()
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\sql\compiler.py",
 line 39, in setup_query
     self.select, self.klass_info, self.annotation_col_map =
 self.get_select()
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\sql\compiler.py",
 line 196, in get_select
     for c in self.get_default_columns():
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\sql\compiler.py",
 line 504, in get_default_columns
     only_load = self.deferred_to_columns()
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\sql\compiler.py",
 line 772, in deferred_to_columns
     self.query.deferred_to_data(columns,
 self.query.get_loaded_field_names_cb)
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\sql\query.py",
 line 684, in deferred_to_data
     callback(target, model, values)
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\sql\query.py",
 line 1804, in get_loaded_field_names_cb
     target[model] = {f.attname for f in fields}
   File
 
"C:\dev\django_con\django_sprint_2015\django_sprint\django\django\db\models\sql\query.py",
 line 1804, in <setcomp>
     target[model] = {f.attname for f in fields}
 AttributeError: 'ManyToOneRel' object has no attribute 'attname'
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/24936>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/050.01975bbe57283419b0f365f8199418db%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to