diff --git a/django/db/models/query.py b/django/db/models/query.py index 436233336d..25995b0d83 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -878,7 +878,10 @@ class QuerySet(AltersData): fields = [self.model._meta.get_field(name) for name in fields] if any(not f.concrete or f.many_to_many for f in fields): raise ValueError("bulk_update() can only be used with concrete fields.") - if any(f in self.model._meta.pk_fields for f in fields): + all_pk_fields = set(self.model._meta.pk_fields) + for parent in self.model._meta.all_parents: + all_pk_fields.update(parent._meta.pk_fields) + if any(f in all_pk_fields for f in fields): raise ValueError("bulk_update() cannot be used with primary key fields.") if not objs: return 0 diff --git a/tests/queries/test_bulk_update.py b/tests/queries/test_bulk_update.py index b2688a61c8..9fa9c3b9b8 100644 --- a/tests/queries/test_bulk_update.py +++ b/tests/queries/test_bulk_update.py @@ -144,6 +144,10 @@ class BulkUpdateTests(TestCase): with self.assertRaisesMessage(ValueError, self.pk_fields_error): CustomPk.objects.bulk_update([], ["name"]) + def test_update_inherited_primary_key(self): + with self.assertRaisesMessage(ValueError, self.pk_fields_error): + SpecialCategory.objects.bulk_update([], ["id"]) + def test_empty_objects(self): with self.assertNumQueries(0): rows_updated = Note.objects.bulk_update([], ["note"])