From f62abfc03da61977bf080163f0a2ef014decd86a Mon Sep 17 00:00:00 2001 From: Quentin Fulsher Date: Tue, 11 Oct 2016 00:59:17 -0700 Subject: Fixed #27295 -- Added a system check to prohibit model names that start or end with an underscore or contain double underscores. --- django/db/models/base.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'django') diff --git a/django/db/models/base.py b/django/db/models/base.py index 1096a58b22..33c562138a 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -1265,7 +1265,11 @@ class Model(six.with_metaclass(ModelBase)): errors.extend(cls._check_fields(**kwargs)) errors.extend(cls._check_m2m_through_same_relationship()) errors.extend(cls._check_long_column_names()) - clash_errors = cls._check_id_field() + cls._check_field_name_clashes() + clash_errors = ( + cls._check_id_field() + + cls._check_field_name_clashes() + + cls._check_model_name_db_lookup_clashes() + ) errors.extend(clash_errors) # If there are field name clashes, hide consequent column name # clashes. @@ -1469,6 +1473,30 @@ class Model(six.with_metaclass(ModelBase)): return errors + @classmethod + def _check_model_name_db_lookup_clashes(cls): + errors = [] + model_name = cls.__name__ + if model_name.startswith('_') or model_name.endswith('_'): + errors.append( + checks.Error( + "The model name '%s' cannot start or end with an underscore " + "as it collides with the query lookup syntax." % model_name, + obj=cls, + id='models.E023' + ) + ) + elif LOOKUP_SEP in model_name: + errors.append( + checks.Error( + "The model name '%s' cannot contain double underscores as " + "it collides with the query lookup syntax." % model_name, + obj=cls, + id='models.E024' + ) + ) + return errors + @classmethod def _check_index_together(cls): """ Check the value of "index_together" option. """ -- cgit v1.3