mirror of
https://github.com/django/django.git
synced 2025-06-02 18:19:11 +00:00
Fixed #36360 -- Fixed QuerySet.update() crash when referring annotations through values().
The issue was only manifesting itself when also filtering againt a related model as that forces the usage of a subquery because SQLUpdateCompiler doesn't support the UPDATE FROM syntax yet. Regression in 65ad4ade74dc9208b9d686a451cd6045df0c9c3a. Refs #28900. Thanks Gav O'Connor for the detailed report.
This commit is contained in:
parent
27ffccc96b
commit
8ef4e0bd42
@ -1250,8 +1250,9 @@ class QuerySet(AltersData):
|
||||
new_order_by.append(col)
|
||||
query.order_by = tuple(new_order_by)
|
||||
|
||||
# Clear any annotations so that they won't be present in subqueries.
|
||||
query.annotations = {}
|
||||
# Clear SELECT clause as all annotation references were inlined by
|
||||
# add_update_values() already.
|
||||
query.clear_select_clause()
|
||||
with transaction.mark_for_rollback_on_error(using=self.db):
|
||||
rows = query.get_compiler(self.db).execute_sql(ROW_COUNT)
|
||||
self._result_cache = None
|
||||
|
@ -51,3 +51,7 @@ Bugfixes
|
||||
|
||||
* Fixed a regression in Django 5.2 that caused a crash when serializing email
|
||||
alternatives or attachments due to named tuple mismatches (:ticket:`36309`).
|
||||
|
||||
* Fixed a regression in Django 5.2 that caused a crash when using ``update()``
|
||||
on a ``QuerySet`` filtered against a related model and including references
|
||||
to annotations through ``values()`` (:ticket:`36360`).
|
||||
|
@ -256,6 +256,13 @@ class AdvancedTests(TestCase):
|
||||
Bar.objects.annotate(abs_id=Abs("m2m_foo")).order_by("-abs_id").update(x=4)
|
||||
self.assertEqual(Bar.objects.get().x, 4)
|
||||
|
||||
def test_update_values_annotation(self):
|
||||
RelatedPoint.objects.annotate(abs_id=Abs("id")).filter(
|
||||
data__is_active=False
|
||||
).values("id", "abs_id").update(data=self.d0)
|
||||
self.r1.refresh_from_db(fields=["data"])
|
||||
self.assertEqual(self.r1.data, self.d0)
|
||||
|
||||
def test_update_negated_f(self):
|
||||
DataPoint.objects.update(is_active=~F("is_active"))
|
||||
self.assertCountEqual(
|
||||
|
Loading…
x
Reference in New Issue
Block a user