diff options
| author | Albert Defler <alnw@interia.eu> | 2022-01-14 12:44:17 +0000 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-02-22 09:16:40 +0100 |
| commit | 7ba6ebe9149ae38257d70100e8bfbfd0da189862 (patch) | |
| tree | 1219f1c985851c59e2904add0ce5a74c3b048ef0 /tests | |
| parent | b7f263551c64e3f80544892e314ed5b0b22cc7c8 (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.py | 12 | ||||
| -rw-r--r-- | tests/many_to_one_null/tests.py | 33 | ||||
| -rw-r--r-- | tests/null_queries/tests.py | 11 |
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): """ |
