mirror of
https://github.com/django/django.git
synced 2025-10-24 14:16:09 +00:00
Fixed #26521 -- Validated CreateModel bases, fields and managers for duplicates.
This commit is contained in:
committed by
Simon Charette
parent
6729b96d8a
commit
417e083e55
@@ -12,6 +12,16 @@ from .fields import (
|
||||
)
|
||||
|
||||
|
||||
def _check_for_duplicates(arg_name, objs):
|
||||
used_vals = set()
|
||||
for val in objs:
|
||||
if val in used_vals:
|
||||
raise ValueError(
|
||||
'Found duplicate %s in CreateModel operation.' % arg_name
|
||||
)
|
||||
used_vals.add(val)
|
||||
|
||||
|
||||
class ModelOperation(Operation):
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
@@ -43,6 +53,16 @@ class CreateModel(ModelOperation):
|
||||
self.bases = bases or (models.Model,)
|
||||
self.managers = managers or []
|
||||
super(CreateModel, self).__init__(name)
|
||||
# Sanity-check that there are no duplicated field names, bases, or
|
||||
# manager names
|
||||
_check_for_duplicates("field", (name for name, _ in self.fields))
|
||||
_check_for_duplicates(
|
||||
"base",
|
||||
(base._meta.label_lower if isinstance(base, models.base.ModelBase) else base.lower()
|
||||
for base in self.bases
|
||||
if base is not models.Model)
|
||||
)
|
||||
_check_for_duplicates("manager", (name for name, _ in self.managers))
|
||||
|
||||
def deconstruct(self):
|
||||
kwargs = {
|
||||
|
||||
Reference in New Issue
Block a user