summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHasan Ramezani <hasan.r67@gmail.com>2018-05-03 11:38:29 +0430
committerCarlton Gibson <carlton.gibson@noumenal.es>2018-05-03 09:08:29 +0200
commit816b8d9518c41f034dcbacfd1f1826f2366975e5 (patch)
tree997a10e0626c8aa06631a7056ef8ff5d56e33edc
parent98019df855fb8fb93e4e9505afeedcad29da3125 (diff)
Fixed #29358 -- Added a system check to prohibit models with more than one primary_key field.
-rw-r--r--django/db/models/base.py14
-rw-r--r--docs/ref/checks.txt1
-rw-r--r--tests/invalid_models_tests/test_models.py13
3 files changed, 28 insertions, 0 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 9af6a8f92d..3573838b99 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -1189,6 +1189,7 @@ class Model(metaclass=ModelBase):
*cls._check_field_name_clashes(),
*cls._check_model_name_db_lookup_clashes(),
*cls._check_property_name_related_field_accessor_clashes(),
+ *cls._check_single_primary_key(),
)
errors.extend(clash_errors)
# If there are field name clashes, hide consequent column name
@@ -1437,6 +1438,19 @@ class Model(metaclass=ModelBase):
return errors
@classmethod
+ def _check_single_primary_key(cls):
+ errors = []
+ if sum(1 for f in cls._meta.local_fields if f.primary_key) > 1:
+ errors.append(
+ checks.Error(
+ "Model can not contain more than one 'primary_key' field.",
+ obj=cls,
+ id='models.E026',
+ )
+ )
+ return errors
+
+ @classmethod
def _check_index_together(cls):
"""Check the value of "index_together" option."""
if not isinstance(cls._meta.index_together, (tuple, list)):
diff --git a/docs/ref/checks.txt b/docs/ref/checks.txt
index 1b9fa18328..9690b5a99b 100644
--- a/docs/ref/checks.txt
+++ b/docs/ref/checks.txt
@@ -295,6 +295,7 @@ Models
as it collides with the query lookup syntax.
* **models.E025**: The property ``<property name>`` clashes with a related
field accessor.
+* **models.E026**: Model can not contain more than one ``primary_key`` field.
Security
--------
diff --git a/tests/invalid_models_tests/test_models.py b/tests/invalid_models_tests/test_models.py
index cfd1a7c465..2066d4ebae 100644
--- a/tests/invalid_models_tests/test_models.py
+++ b/tests/invalid_models_tests/test_models.py
@@ -717,6 +717,19 @@ class OtherModelTests(SimpleTestCase):
)
])
+ def test_single_primary_key(self):
+ class Model(models.Model):
+ foo = models.IntegerField(primary_key=True)
+ bar = models.IntegerField(primary_key=True)
+
+ self.assertEqual(Model.check(), [
+ Error(
+ "Model can not contain more than one 'primary_key' field.",
+ obj=Model,
+ id='models.E026',
+ )
+ ])
+
@override_settings(TEST_SWAPPED_MODEL_BAD_VALUE='not-a-model')
def test_swappable_missing_app_name(self):
class Model(models.Model):