Explorar o código

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.
Simon Charette hai 1 mes
pai
achega
c3a23aa02f

+ 1 - 1
django/db/models/fields/related_descriptors.py

@@ -1172,7 +1172,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:

+ 5 - 0
docs/releases/5.1.7.txt

@@ -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`).

+ 8 - 0
tests/m2m_through/tests.py

@@ -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())