#28838: annotations + base_manager_name + instance.save() raises exception
-------------------------------------+-------------------------------------
Reporter: James | Owner: nobody
Addison |
Type: Bug | Status: new
Component: Database | Version: 1.11
layer (models, ORM) |
Severity: Normal | Keywords:
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
With a models.py like:
{{{#!python
class ItemManager(models.Manager):
def get_queryset(self):
return super().get_queryset().annotate(
rating_avg=models.Avg('review__rating')
)
class Item(models.Model):
name = models.CharField(max_length=10, default='')
objects = ItemManager()
class Meta:
base_manager_name = 'objects'
class Review(models.Model):
item = models.ForeignKey(Item)
rating = models.PositiveSmallIntegerField(default=0)
}}}
If an `Item` instance is modified and `item.save()` is called like this:
{{{
item = Item.objects.first()
item.name = 'abc'
item.save()
}}}
It will raise this exception:
{{{
Traceback (most recent call last):
File "/home/myuser/django_annotations_bug/the_bug/tests.py", line 9, in
test_bug_will_be_triggered
item.save()
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/models/base.py", line 808, in save
force_update=force_update, update_fields=update_fields)
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/models/base.py", line 838, in save_base
updated = self._save_table(raw, cls, force_insert, force_update,
using, update_fields)
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/models/base.py", line 905, in _save_table
forced_update)
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/models/base.py", line 955, in _do_update
return filtered._update(values) > 0
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/models/query.py", line 664, in _update
return query.get_compiler(self.db).execute_sql(CURSOR)
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/models/sql/compiler.py", line 1199, in
execute_sql
cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/models/sql/compiler.py", line 894, in execute_sql
raise original_exception
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/models/sql/compiler.py", line 884, in execute_sql
cursor.execute(sql, params)
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/home/myuser/.virtualenvs/django_annotations_bug/lib/python3.6
/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: sub-select returns 2 columns - expected
1
}}}
I have attached a simple sample project that reproduces this error. To set
it up:
{{{
tar xzvf bug.tgz
cd django_annotations_bug
mkvirtualenv -ppython3 buggy_mcbugface
pip install -r requirements.txt
./manage.py test
}}}
Related to #19513, #28374, #26539 - this those are related to `.update()`
calls, mostly. This example does not use the annotation in the
save/updating of the item, so is different I think.
--
Ticket URL: <https://code.djangoproject.com/ticket/28838>
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/051.93768f32d4e44bb0657640b2e9ca1531%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.