summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrian <bdnettleton@gmail.com>2025-01-06 17:50:44 -0800
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-02-06 15:27:26 +0100
commitb96e4c04b666b1044555d7a32f64e83cbad57b03 (patch)
tree56a8e08577c9a8e706b6aeaed919ad4cb30cb288
parent8aea6b802ced18a54f00db71c53e09c643f7514c (diff)
[5.2.x] Fixed #36061 -- Added migration support for ManyToManyField.through_fields.
Added through_fields support to ManyToManyField.deconstruct. Thanks to Simon Charette for pointers and the review. Backport of b13b8684a04d0bc1081104c5973c62c27dc673b0 from main.
-rw-r--r--AUTHORS1
-rw-r--r--django/db/models/fields/related.py2
-rw-r--r--tests/field_deconstruction/tests.py17
3 files changed, 20 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
index 9a76e8879e..e3389edbf5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -180,6 +180,7 @@ answer newbie questions, and generally made Django that much better:
Brian Fabian Crain <http://www.bfc.do/>
Brian Harring <ferringb@gmail.com>
Brian Helba <brian.helba@kitware.com>
+ Brian Nettleton <bdnettleton@gmail.com>
Brian Ray <http://brianray.chipy.org/>
Brian Rosner <brosner@gmail.com>
Bruce Kroeze <https://coderseye.com/>
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index de8fe9c339..e873e5ca86 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -1819,6 +1819,8 @@ class ManyToManyField(RelatedField):
kwargs["through"] = self.remote_field.through
elif not self.remote_field.through._meta.auto_created:
kwargs["through"] = self.remote_field.through._meta.label
+ if through_fields := getattr(self.remote_field, "through_fields", None):
+ kwargs["through_fields"] = through_fields
# If swappable is True, then see if we're actually pointing to the target
# of a swap.
swappable_setting = self.swappable_setting
diff --git a/tests/field_deconstruction/tests.py b/tests/field_deconstruction/tests.py
index 3b10ee0091..41353cbaaf 100644
--- a/tests/field_deconstruction/tests.py
+++ b/tests/field_deconstruction/tests.py
@@ -516,6 +516,23 @@ class FieldDeconstructionTests(SimpleTestCase):
self.assertEqual(path, "django.db.models.ManyToManyField")
self.assertEqual(args, [])
self.assertEqual(kwargs, {"to": "auth.permission", "through": "auth.Group"})
+ # Test through_fields
+ field = models.ManyToManyField(
+ "auth.Permission",
+ through="auth.Group",
+ through_fields=("foo", "permissions"),
+ )
+ name, path, args, kwargs = field.deconstruct()
+ self.assertEqual(path, "django.db.models.ManyToManyField")
+ self.assertEqual(args, [])
+ self.assertEqual(
+ kwargs,
+ {
+ "to": "auth.permission",
+ "through": "auth.Group",
+ "through_fields": ("foo", "permissions"),
+ },
+ )
# Test custom db_table
field = models.ManyToManyField("auth.Permission", db_table="custom_table")
name, path, args, kwargs = field.deconstruct()