summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Wobrock <david.wobrock@gmail.com>2022-08-24 21:14:32 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-08-27 15:03:48 +0200
commit806e9e2d0dcf8f58e376fb7e2a8b9771e2a9ce16 (patch)
treeae903f4d6f931f42ecc53b4adedb0c4afc7b6742
parent0701bb8e1f1771b36cdde45602ad377007e372b3 (diff)
Fixed #33952 -- Reallowed creating reverse foreign key managers on unsaved instances.
Thanks Claude Paroz for the report. Regression in 7ba6ebe9149ae38257d70100e8bfbfd0da189862.
-rw-r--r--django/db/models/fields/related_descriptors.py17
-rw-r--r--docs/releases/4.1.1.txt3
-rw-r--r--tests/many_to_one/tests.py3
3 files changed, 14 insertions, 9 deletions
diff --git a/django/db/models/fields/related_descriptors.py b/django/db/models/fields/related_descriptors.py
index 6e9f7bccbf..e61ee077f0 100644
--- a/django/db/models/fields/related_descriptors.py
+++ b/django/db/models/fields/related_descriptors.py
@@ -647,15 +647,6 @@ def create_reverse_many_to_one_manager(superclass, rel):
self.core_filters = {self.field.name: instance}
- # Even if this relation is not to pk, we require still pk value.
- # The wish is that the instance has been already saved to DB,
- # although having a pk value isn't a guarantee of that.
- if self.instance.pk is None:
- raise ValueError(
- f"{instance.__class__.__name__!r} instance needs to have a primary "
- f"key value before this relationship can be used."
- )
-
def __call__(self, *, manager):
manager = getattr(self.model, manager)
manager_class = create_reverse_many_to_one_manager(manager.__class__, rel)
@@ -720,6 +711,14 @@ def create_reverse_many_to_one_manager(superclass, rel):
pass # nothing to clear from cache
def get_queryset(self):
+ # Even if this relation is not to pk, we require still pk value.
+ # The wish is that the instance has been already saved to DB,
+ # although having a pk value isn't a guarantee of that.
+ if self.instance.pk is None:
+ raise ValueError(
+ f"{self.instance.__class__.__name__!r} instance needs to have a "
+ f"primary key value before this relationship can be used."
+ )
try:
return self.instance._prefetched_objects_cache[
self.field.remote_field.get_cache_name()
diff --git a/docs/releases/4.1.1.txt b/docs/releases/4.1.1.txt
index 3c218274f2..f97015b9fa 100644
--- a/docs/releases/4.1.1.txt
+++ b/docs/releases/4.1.1.txt
@@ -49,3 +49,6 @@ Bugfixes
* Fixed a regression in Django 4.1 that caused an incorrect migration when
renaming a model with ``ManyToManyField`` and ``db_table`` (:ticket:`33953`).
+
+* Reallowed, following a regression in Django 4.1, creating reverse foreign key
+ managers on unsaved instances (:ticket:`33952`).
diff --git a/tests/many_to_one/tests.py b/tests/many_to_one/tests.py
index d9a8984c4c..ae9bce6b44 100644
--- a/tests/many_to_one/tests.py
+++ b/tests/many_to_one/tests.py
@@ -758,6 +758,9 @@ class ManyToOneTests(TestCase):
)
with self.assertRaisesMessage(ValueError, msg):
th.child_set.count()
+ # The reverse foreign key manager can be created.
+ self.assertEqual(th.child_set.model, Third)
+
th.save()
# Now the model is saved, so we will need to execute a query.
with self.assertNumQueries(1):