mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
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>
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user