Fixed #36389 -- Fixed GenericRelation.update() use write DB connection.

Signed-off-by: SaJH <wogur981208@gmail.com>
This commit is contained in:
SaJH 2025-05-18 02:07:11 +09:00
parent 0b2ed4f7c8
commit dc8ac83ae7
2 changed files with 33 additions and 2 deletions

View file

@ -608,8 +608,11 @@ def create_generic_related_manager(superclass, rel):
"""
Filter the queryset for the instance this manager is bound to.
"""
db = self._db or router.db_for_read(self.model, instance=self.instance)
return queryset.using(db).filter(**self.core_filters)
queryset._add_hints(instance=self.instance)
if self._db:
queryset = queryset.using(self._db)
queryset._defer_next_filter = True
return queryset.filter(**self.core_filters)
def _remove_prefetched_objects(self):
try:

View file

@ -2530,6 +2530,34 @@ class RouteForWriteTestCase(TestCase):
self.assertEqual(e.model, Book)
self.assertEqual(e.hints, {"instance": auth})
def test_generic_rel_update(self):
book = Book.objects.create(
title="Pro Django", published=datetime.date(2008, 12, 16)
)
Review.objects.create(source="Python Monthly", content_object=book)
with self.assertRaises(RouterUsed) as cm:
with self.override_router():
book.reviews.update(source="Python Daily")
e = cm.exception
self.assertEqual(e.mode, RouterUsed.WRITE)
self.assertEqual(e.model, Review)
self.assertEqual(e.hints, {"instance": book})
def test_generic_rel_delete(self):
book = Book.objects.create(
title="Pro Django", published=datetime.date(2008, 12, 16)
)
Review.objects.create(source="Python Monthly", content_object=book)
with self.assertRaises(RouterUsed) as cm:
with self.override_router():
book.reviews.all().delete()
e = cm.exception
self.assertEqual(e.mode, RouterUsed.WRITE)
self.assertEqual(e.model, Review)
self.assertEqual(e.hints, {"instance": book})
class NoRelationRouter:
"""Disallow all relations."""