From 2b6a3baebe70e4d481dd256bdb774ac15e248540 Mon Sep 17 00:00:00 2001 From: Albert Defler Date: Sat, 5 Feb 2022 20:00:20 +0000 Subject: Fixed #31486 -- Deprecated passing unsaved objects to related filters. Co-Authored-By: Hasan Ramezani --- tests/queries/tests.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'tests/queries') diff --git a/tests/queries/tests.py b/tests/queries/tests.py index 594afe25b6..800e71557b 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -12,7 +12,8 @@ from django.db.models.expressions import RawSQL from django.db.models.sql.constants import LOUTER from django.db.models.sql.where import NothingNode, WhereNode from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature -from django.test.utils import CaptureQueriesContext +from django.test.utils import CaptureQueriesContext, ignore_warnings +from django.utils.deprecation import RemovedInDjango50Warning from .models import ( FK1, @@ -1899,6 +1900,19 @@ class Queries5Tests(TestCase): self.assertEqual(Ranking.objects.filter(author__in=authors).get(), self.rank3) self.assertEqual(authors.count(), 1) + def test_filter_unsaved_object(self): + # These tests will catch ValueError in Django 5.0 when passing unsaved + # model instances to related filters becomes forbidden. + # msg = "Model instances passed to related filters must be saved." + msg = "Passing unsaved model instances to related filters is deprecated." + company = Company.objects.create(name="Django") + with self.assertWarnsMessage(RemovedInDjango50Warning, msg): + Employment.objects.filter(employer=Company(name="unsaved")) + with self.assertWarnsMessage(RemovedInDjango50Warning, msg): + Employment.objects.filter(employer__in=[company, Company(name="unsaved")]) + with self.assertWarnsMessage(RemovedInDjango50Warning, msg): + StaffUser.objects.filter(staff=Staff(name="unsaved")) + class SelectRelatedTests(TestCase): def test_tickets_3045_3288(self): @@ -3211,6 +3225,7 @@ class ExcludeTests(TestCase): [self.j1, self.j2], ) + @ignore_warnings(category=RemovedInDjango50Warning) def test_exclude_unsaved_o2o_object(self): jack = Staff.objects.create(name="jack") jack_staff = StaffUser.objects.create(staff=jack) @@ -3221,6 +3236,19 @@ class ExcludeTests(TestCase): StaffUser.objects.exclude(staff=unsaved_object), [jack_staff] ) + def test_exclude_unsaved_object(self): + # These tests will catch ValueError in Django 5.0 when passing unsaved + # model instances to related filters becomes forbidden. + # msg = "Model instances passed to related filters must be saved." + company = Company.objects.create(name="Django") + msg = "Passing unsaved model instances to related filters is deprecated." + with self.assertWarnsMessage(RemovedInDjango50Warning, msg): + Employment.objects.exclude(employer=Company(name="unsaved")) + with self.assertWarnsMessage(RemovedInDjango50Warning, msg): + Employment.objects.exclude(employer__in=[company, Company(name="unsaved")]) + with self.assertWarnsMessage(RemovedInDjango50Warning, msg): + StaffUser.objects.exclude(staff=Staff(name="unsaved")) + class ExcludeTest17600(TestCase): """ -- cgit v1.2.1