diff options
| author | John Parton <john.parton.iv@gmail.com> | 2024-08-18 23:12:14 -0500 |
|---|---|---|
| committer | Jacob Walls <jacobtylerwalls@gmail.com> | 2025-09-25 08:51:43 -0400 |
| commit | 1820d35b17f0a95f4ce888971b9ca0c7a3697c83 (patch) | |
| tree | 7419afb8156f7869595cc06cefe872f95597f77c /tests/lookup | |
| parent | 68aae8878ff90dd787db55ecc44ee712525ccdc6 (diff) | |
Fixed #36605 -- Added support for QuerySet.in_bulk() after .values() or .values_list().
co-authored-by: Adam Johnson <me@adamj.eu>
co-authored-by: Simon Charette <charette.s@gmail.com>
Diffstat (limited to 'tests/lookup')
| -rw-r--r-- | tests/lookup/tests.py | 246 |
1 files changed, 240 insertions, 6 deletions
diff --git a/tests/lookup/tests.py b/tests/lookup/tests.py index e013666fc4..f6f73e9fac 100644 --- a/tests/lookup/tests.py +++ b/tests/lookup/tests.py @@ -317,12 +317,246 @@ class LookupTests(TestCase): with self.assertRaisesMessage(TypeError, msg): Article.objects.all()[0:5].in_bulk([self.a1.id, self.a2.id]) - def test_in_bulk_not_model_iterable(self): - msg = "in_bulk() cannot be used with values() or values_list()." - with self.assertRaisesMessage(TypeError, msg): - Author.objects.values().in_bulk() - with self.assertRaisesMessage(TypeError, msg): - Author.objects.values_list().in_bulk() + def test_in_bulk_values_empty(self): + arts = Article.objects.values().in_bulk([]) + self.assertEqual(arts, {}) + + def test_in_bulk_values_all(self): + Article.objects.exclude(pk__in=[self.a1.pk, self.a2.pk]).delete() + arts = Article.objects.values().in_bulk() + self.assertEqual( + arts, + { + self.a1.pk: { + "id": self.a1.pk, + "author_id": self.au1.pk, + "headline": "Article 1", + "pub_date": self.a1.pub_date, + "slug": "a1", + }, + self.a2.pk: { + "id": self.a2.pk, + "author_id": self.au1.pk, + "headline": "Article 2", + "pub_date": self.a2.pub_date, + "slug": "a2", + }, + }, + ) + + def test_in_bulk_values_pks(self): + arts = Article.objects.values().in_bulk([self.a1.pk]) + self.assertEqual( + arts, + { + self.a1.pk: { + "id": self.a1.pk, + "author_id": self.au1.pk, + "headline": "Article 1", + "pub_date": self.a1.pub_date, + "slug": "a1", + } + }, + ) + + def test_in_bulk_values_fields(self): + arts = Article.objects.values("headline").in_bulk([self.a1.pk]) + self.assertEqual( + arts, + {self.a1.pk: {"headline": "Article 1"}}, + ) + + def test_in_bulk_values_fields_including_pk(self): + arts = Article.objects.values("pk", "headline").in_bulk([self.a1.pk]) + self.assertEqual( + arts, + {self.a1.pk: {"pk": self.a1.pk, "headline": "Article 1"}}, + ) + + def test_in_bulk_values_fields_pk(self): + arts = Article.objects.values("pk").in_bulk([self.a1.pk]) + self.assertEqual( + arts, + {self.a1.pk: {"pk": self.a1.pk}}, + ) + + def test_in_bulk_values_fields_id(self): + arts = Article.objects.values("id").in_bulk([self.a1.pk]) + self.assertEqual( + arts, + {self.a1.pk: {"id": self.a1.pk}}, + ) + + def test_in_bulk_values_alternative_field_name(self): + arts = Article.objects.values("headline").in_bulk( + [self.a1.slug], field_name="slug" + ) + self.assertEqual( + arts, + {self.a1.slug: {"headline": "Article 1"}}, + ) + + def test_in_bulk_values_list_empty(self): + arts = Article.objects.values_list().in_bulk([]) + self.assertEqual(arts, {}) + + def test_in_bulk_values_list_all(self): + Article.objects.exclude(pk__in=[self.a1.pk, self.a2.pk]).delete() + arts = Article.objects.values_list().in_bulk() + self.assertEqual( + arts, + { + self.a1.pk: ( + self.a1.pk, + "Article 1", + self.a1.pub_date, + self.au1.pk, + "a1", + ), + self.a2.pk: ( + self.a2.pk, + "Article 2", + self.a2.pub_date, + self.au1.pk, + "a2", + ), + }, + ) + + def test_in_bulk_values_list_fields(self): + arts = Article.objects.values_list("headline").in_bulk([self.a1.pk, self.a2.pk]) + self.assertEqual( + arts, + { + self.a1.pk: ("Article 1",), + self.a2.pk: ("Article 2",), + }, + ) + + def test_in_bulk_values_list_fields_including_pk(self): + arts = Article.objects.values_list("pk", "headline").in_bulk( + [self.a1.pk, self.a2.pk] + ) + self.assertEqual( + arts, + { + self.a1.pk: (self.a1.pk, "Article 1"), + self.a2.pk: (self.a2.pk, "Article 2"), + }, + ) + + def test_in_bulk_values_list_fields_pk(self): + arts = Article.objects.values_list("pk").in_bulk([self.a1.pk, self.a2.pk]) + self.assertEqual( + arts, + { + self.a1.pk: (self.a1.pk,), + self.a2.pk: (self.a2.pk,), + }, + ) + + def test_in_bulk_values_list_fields_id(self): + arts = Article.objects.values_list("id").in_bulk([self.a1.pk, self.a2.pk]) + self.assertEqual( + arts, + { + self.a1.pk: (self.a1.pk,), + self.a2.pk: (self.a2.pk,), + }, + ) + + def test_in_bulk_values_list_named(self): + arts = Article.objects.values_list(named=True).in_bulk([self.a1.pk, self.a2.pk]) + self.assertIsInstance(arts, dict) + self.assertEqual(len(arts), 2) + arts1 = arts[self.a1.pk] + self.assertEqual( + arts1._fields, ("pk", "id", "headline", "pub_date", "author_id", "slug") + ) + self.assertEqual(arts1.pk, self.a1.pk) + self.assertEqual(arts1.headline, "Article 1") + self.assertEqual(arts1.pub_date, self.a1.pub_date) + self.assertEqual(arts1.author_id, self.au1.pk) + self.assertEqual(arts1.slug, "a1") + + def test_in_bulk_values_list_named_fields(self): + arts = Article.objects.values_list("pk", "headline", named=True).in_bulk( + [self.a1.pk, self.a2.pk] + ) + self.assertIsInstance(arts, dict) + self.assertEqual(len(arts), 2) + arts1 = arts[self.a1.pk] + self.assertEqual(arts1._fields, ("pk", "headline")) + self.assertEqual(arts1.pk, self.a1.pk) + self.assertEqual(arts1.headline, "Article 1") + + def test_in_bulk_values_list_named_fields_alternative_field(self): + arts = Article.objects.values_list("headline", named=True).in_bulk( + [self.a1.slug, self.a2.slug], field_name="slug" + ) + self.assertEqual(len(arts), 2) + arts1 = arts[self.a1.slug] + self.assertEqual(arts1._fields, ("slug", "headline")) + self.assertEqual(arts1.slug, "a1") + self.assertEqual(arts1.headline, "Article 1") + + def test_in_bulk_values_list_flat_empty(self): + arts = Article.objects.values_list(flat=True).in_bulk([]) + self.assertEqual(arts, {}) + + def test_in_bulk_values_list_flat_all(self): + Article.objects.exclude(pk__in=[self.a1.pk, self.a2.pk]).delete() + arts = Article.objects.values_list(flat=True).in_bulk() + self.assertEqual( + arts, + { + self.a1.pk: self.a1.pk, + self.a2.pk: self.a2.pk, + }, + ) + + def test_in_bulk_values_list_flat_pks(self): + arts = Article.objects.values_list(flat=True).in_bulk([self.a1.pk, self.a2.pk]) + self.assertEqual( + arts, + { + self.a1.pk: self.a1.pk, + self.a2.pk: self.a2.pk, + }, + ) + + def test_in_bulk_values_list_flat_field(self): + arts = Article.objects.values_list("headline", flat=True).in_bulk( + [self.a1.pk, self.a2.pk] + ) + self.assertEqual( + arts, + {self.a1.pk: "Article 1", self.a2.pk: "Article 2"}, + ) + + def test_in_bulk_values_list_flat_field_pk(self): + arts = Article.objects.values_list("pk", flat=True).in_bulk( + [self.a1.pk, self.a2.pk] + ) + self.assertEqual( + arts, + { + self.a1.pk: self.a1.pk, + self.a2.pk: self.a2.pk, + }, + ) + + def test_in_bulk_values_list_flat_field_id(self): + arts = Article.objects.values_list("id", flat=True).in_bulk( + [self.a1.pk, self.a2.pk] + ) + self.assertEqual( + arts, + { + self.a1.pk: self.a1.pk, + self.a2.pk: self.a2.pk, + }, + ) def test_values(self): # values() returns a list of dictionaries instead of object instances, |
