summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/base.py2
-rw-r--r--docs/releases/5.2.8.txt3
-rw-r--r--tests/composite_pk/test_checks.py35
3 files changed, 39 insertions, 1 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index d7d207901b..77353121f5 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -1782,7 +1782,7 @@ class Model(AltersData, metaclass=ModelBase):
meta = cls._meta
pk = meta.pk
- if not isinstance(pk, CompositePrimaryKey):
+ if meta.proxy or not isinstance(pk, CompositePrimaryKey):
return errors
seen_columns = defaultdict(list)
diff --git a/docs/releases/5.2.8.txt b/docs/releases/5.2.8.txt
index a75db9cbc8..62cb32f55c 100644
--- a/docs/releases/5.2.8.txt
+++ b/docs/releases/5.2.8.txt
@@ -16,3 +16,6 @@ Bugfixes
* Fixed a bug in Django 5.2 where ``QuerySet.first()`` and ``QuerySet.last()``
raised an error on querysets performing aggregation that selected all fields
of a composite primary key.
+
+* Fixed a bug in Django 5.2 where proxy models having a ``CompositePrimaryKey``
+ incorrectly raised a ``models.E042`` system check error.
diff --git a/tests/composite_pk/test_checks.py b/tests/composite_pk/test_checks.py
index c33f2ee2eb..21796aa871 100644
--- a/tests/composite_pk/test_checks.py
+++ b/tests/composite_pk/test_checks.py
@@ -268,3 +268,38 @@ class CompositePKChecksTests(TestCase):
),
],
)
+
+ def test_proxy_model_can_subclass_model_with_composite_pk(self):
+ class Foo(models.Model):
+ pk = models.CompositePrimaryKey("a", "b")
+ a = models.SmallIntegerField()
+ b = models.SmallIntegerField()
+
+ class Bar(Foo):
+ class Meta:
+ proxy = True
+
+ self.assertEqual(Foo.check(databases=self.databases), [])
+ self.assertEqual(Bar.check(databases=self.databases), [])
+
+ def test_proxy_model_does_not_check_superclass_composite_pk_errors(self):
+ class Foo(models.Model):
+ pk = models.CompositePrimaryKey("a", "b")
+ a = models.SmallIntegerField()
+
+ class Bar(Foo):
+ class Meta:
+ proxy = True
+
+ self.assertEqual(
+ Foo.check(databases=self.databases),
+ [
+ checks.Error(
+ "'b' cannot be included in the composite primary key.",
+ hint="'b' is not a valid field.",
+ obj=Foo,
+ id="models.E042",
+ ),
+ ],
+ )
+ self.assertEqual(Bar.check(databases=self.databases), [])