Opened 13 years ago
Closed 13 years ago
#19064 closed Bug (duplicate)
select_related doesn't work for reverse one-to-one with inheritance
| Reported by: | Piotr Czachur | Owned by: | nobody |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Docs say…
You can also refer to the reverse direction of a OneToOneField in the list of fields passed to select_related — that is, you can traverse a OneToOneField back to the object on which the field is defined. Instead of specifying the field name, use the related_name for the field on the related object.
How to reproduce
# myapp/models.py
class Dam(models.Model):
name = models.CharField(max_length=32)
class Animal(models.Model):
nickname = models.CharField(max_length=32)
class Beaver(Animal):
dam = models.OneToOneField(Dam, related_name='beaver')
favourite_meal = models.CharField(max_length=32)
# myapp/fixtures/initial_data.yaml
- model: myapp.Dam
pk: 1
fields:
name: Hoover
- model: myapp.Animal
pk: 1
fields:
nickname: Harold
- model: myapp.Beaver
pk: 1
fields:
dam: 1
favourite_meal: spagetti
# /tmp/mypro$ python2.7 manage.py shell
In [1]: from mypro.myapp.models import *
In [2]: Beaver.objects.select_related('dam')
Out[2]: [<Beaver: Beaver object>]
In [3]: Dam.objects.select_related('beaver')
Out[3]: []
In [4]: len(Dam.objects.select_related('beaver'))
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (494, 0))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/tmp/mypro/django/core/management/commands/shell.pyc in <module>()
----> 1 len(Dam.objects.select_related('beaver'))
/tmp/mypro/django/db/models/query.pyc in __len__(self)
87 self._result_cache = list(self._iter)
88 else:
---> 89 self._result_cache = list(self.iterator())
90 elif self._iter:
91 self._result_cache.extend(self._iter)
/tmp/mypro/django/db/models/query.pyc in iterator(self)
298 if fill_cache:
299 obj, _ = get_cached_row(row, index_start, db, klass_info,
--> 300 offset=len(aggregate_select))
301 else:
302 # Omit aggregates in object creation.
/tmp/mypro/django/db/models/query.pyc in get_cached_row(row, index_start, using, klass_info, offset)
1457 for rel_field, rel_model in rel_obj._meta.get_fields_with_model():
1458 if rel_model is not None:
-> 1459 setattr(rel_obj, rel_field.attname, getattr(obj, rel_field.attname))
1460 # populate the field cache for any related object
1461 # that has already been retrieved
AttributeError: 'Dam' object has no attribute 'nickname'
Change History (2)
comment:1 by , 13 years ago
comment:2 by , 13 years ago
| Resolution: | → duplicate |
|---|---|
| Status: | new → closed |
Marking as duplicate of #13781.
Note:
See TracTickets
for help on using tickets.
Patch from #13781 fixes this issue.