1
0
mirror of https://github.com/django/django.git synced 2025-03-06 15:32:33 +00:00

[5.2.x] Fixed #36197 -- Fixed improper many-to-many count() and exists() for non-pk to_field.

Regression in 66e47ac69a7e71cf32eee312d05668d8f1ba24bb.

Thanks mfontana-elem for the report and Sarah for the tests.

Backport of c3a23aa02faa1cf1d32e43d66858e793cd9ecac4 from main.
This commit is contained in:
Simon Charette 2025-02-17 13:45:31 -05:00 committed by Sarah Boyce
parent b0d497ada0
commit 6b8a6e1251
3 changed files with 14 additions and 1 deletions

View File

@ -1219,7 +1219,7 @@ def create_forward_many_to_many_manager(superclass, rel, reverse):
return None
hints = {"instance": self.instance}
manager = self.through._base_manager.db_manager(db, hints=hints)
filters = {self.source_field_name: self.instance.pk}
filters = {self.source_field_name: self.related_val[0]}
# Nullable target rows must be excluded as well as they would have
# been filtered out from an INNER JOIN.
if self.target_field.null:

View File

@ -16,3 +16,8 @@ Bugfixes
* Fixed a bug in Django 5.1 where ``FileSystemStorage``, with
``allow_overwrite`` set to ``True``, did not truncate the overwritten file
content (:ticket:`36191`).
* Fixed a regression in Django 5.1 where the ``count`` and ``exists`` methods
of ``ManyToManyField`` related managers would always return ``0`` and
``False`` when the intermediary model back references used ``to_field``
(:ticket:`36197`).

View File

@ -533,3 +533,11 @@ class M2mThroughToFieldsTests(TestCase):
[choice[0] for choice in field.get_choices(include_blank=False)],
["pea", "potato", "tomato"],
)
def test_count(self):
self.assertEqual(self.curry.ingredients.count(), 3)
self.assertEqual(self.tomato.recipes.count(), 1)
def test_exists(self):
self.assertTrue(self.curry.ingredients.exists())
self.assertTrue(self.tomato.recipes.exists())