diff --git a/django/db/models/query.py b/django/db/models/query.py index 3f9d4768f7..b5c1cf6e78 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -1101,6 +1101,8 @@ class QuerySet(AltersData): """ if self.query.is_sliced: raise TypeError("Cannot use 'limit' or 'offset' with in_bulk().") + if not issubclass(self._iterable_class, ModelIterable): + raise TypeError("in_bulk() cannot be used with values() or values_list().") opts = self.model._meta unique_fields = [ constraint.fields[0] diff --git a/tests/lookup/tests.py b/tests/lookup/tests.py index 28acd72874..68adbe6496 100644 --- a/tests/lookup/tests.py +++ b/tests/lookup/tests.py @@ -327,6 +327,13 @@ 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_values(self): # values() returns a list of dictionaries instead of object instances -- # and you can specify which fields you want to retrieve.