summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAlbert Defler <alnw@interia.eu>2022-01-14 12:44:17 +0000
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-02-22 09:16:40 +0100
commit7ba6ebe9149ae38257d70100e8bfbfd0da189862 (patch)
tree1219f1c985851c59e2904add0ce5a74c3b048ef0 /tests
parentb7f263551c64e3f80544892e314ed5b0b22cc7c8 (diff)
Fixed #19580 -- Unified behavior of reverse foreign key and many-to-many relations for unsaved instances.
Diffstat (limited to 'tests')
-rw-r--r--tests/many_to_one/tests.py12
-rw-r--r--tests/many_to_one_null/tests.py33
-rw-r--r--tests/null_queries/tests.py11
3 files changed, 48 insertions, 8 deletions
diff --git a/tests/many_to_one/tests.py b/tests/many_to_one/tests.py
index b8b040eff6..2311834481 100644
--- a/tests/many_to_one/tests.py
+++ b/tests/many_to_one/tests.py
@@ -738,14 +738,16 @@ class ManyToOneTests(TestCase):
self.assertEqual("id", cat.remote_field.get_related_field().name)
def test_relation_unsaved(self):
- # The <field>_set manager does not join on Null value fields (#17541)
Third.objects.create(name="Third 1")
Third.objects.create(name="Third 2")
th = Third(name="testing")
- # The object isn't saved and thus the relation field is null - we won't even
- # execute a query in this case.
- with self.assertNumQueries(0):
- self.assertEqual(th.child_set.count(), 0)
+ # The object isn't saved and the relation cannot be used.
+ msg = (
+ "'Third' instance needs to have a primary key value before this "
+ "relationship can be used."
+ )
+ with self.assertRaisesMessage(ValueError, msg):
+ th.child_set.count()
th.save()
# Now the model is saved, so we will need to execute a query.
with self.assertNumQueries(1):
diff --git a/tests/many_to_one_null/tests.py b/tests/many_to_one_null/tests.py
index 5bd06b1ac4..f92d49f0a9 100644
--- a/tests/many_to_one_null/tests.py
+++ b/tests/many_to_one_null/tests.py
@@ -146,3 +146,36 @@ class ManyToOneNullTests(TestCase):
self.assertIs(d1.car, None)
with self.assertNumQueries(0):
self.assertEqual(list(c1.drivers.all()), [])
+
+ def test_unsaved(self):
+ msg = (
+ "'Car' instance needs to have a primary key value before this relationship "
+ "can be used."
+ )
+ with self.assertRaisesMessage(ValueError, msg):
+ Car(make="Ford").drivers.all()
+
+ def test_related_null_to_field_related_managers(self):
+ car = Car.objects.create(make=None)
+ driver = Driver.objects.create()
+ msg = (
+ f'"{car!r}" needs to have a value for field "make" before this '
+ f"relationship can be used."
+ )
+ with self.assertRaisesMessage(ValueError, msg):
+ car.drivers.add(driver)
+ with self.assertRaisesMessage(ValueError, msg):
+ car.drivers.create()
+ with self.assertRaisesMessage(ValueError, msg):
+ car.drivers.get_or_create()
+ with self.assertRaisesMessage(ValueError, msg):
+ car.drivers.update_or_create()
+ with self.assertRaisesMessage(ValueError, msg):
+ car.drivers.remove(driver)
+ with self.assertRaisesMessage(ValueError, msg):
+ car.drivers.clear()
+ with self.assertRaisesMessage(ValueError, msg):
+ car.drivers.set([driver])
+
+ with self.assertNumQueries(0):
+ self.assertEqual(car.drivers.count(), 0)
diff --git a/tests/null_queries/tests.py b/tests/null_queries/tests.py
index 4c5c3bbe5c..828c68d921 100644
--- a/tests/null_queries/tests.py
+++ b/tests/null_queries/tests.py
@@ -44,9 +44,14 @@ class NullQueriesTests(TestCase):
with self.assertRaisesMessage(ValueError, "Cannot use None as a query value"):
Choice.objects.filter(id__gt=None)
- # Related managers use __exact=None implicitly if the object hasn't been saved.
- p2 = Poll(question="How?")
- self.assertEqual(repr(p2.choice_set.all()), "<QuerySet []>")
+ def test_unsaved(self):
+ poll = Poll(question="How?")
+ msg = (
+ "'Poll' instance needs to have a primary key value before this "
+ "relationship can be used."
+ )
+ with self.assertRaisesMessage(ValueError, msg):
+ poll.choice_set.all()
def test_reverse_relations(self):
"""