#18866 closed Bug (fixed)
model Meta verbose_name too long error message not obvious
Reported by: | Elena Williams | Owned by: | toyg |
---|---|---|---|
Component: | contrib.auth | Version: | 1.4 |
Severity: | Normal | Keywords: | |
Cc: | kerry@… | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | yes | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Running:
$ python manage.py syncdb
The following error messages:
Postgres:
Creating tables ... Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line utility.execute() File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 382, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv self.execute(*args, **options.__dict__) File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 232, in execute output = self.handle(*args, **options) File "/Library/Python/2.7/site-packages/django/core/management/base.py", line 371, in handle return self.handle_noargs(**options) File "/Library/Python/2.7/site-packages/django/core/management/commands/syncdb.py", line 110, in handle_noargs emit_post_sync_signal(created_models, verbosity, interactive, db) File "/Library/Python/2.7/site-packages/django/core/management/sql.py", line 189, in emit_post_sync_signal interactive=interactive, db=db) File "/Library/Python/2.7/site-packages/django/dispatch/dispatcher.py", line 172, in send response = receiver(signal=self, sender=sender, **named) File "/Library/Python/2.7/site-packages/django/contrib/auth/management/__init__.py", line 54, in create_permissions auth_app.Permission.objects.bulk_create(objs) File "/Library/Python/2.7/site-packages/django/db/models/manager.py", line 140, in bulk_create return self.get_query_set().bulk_create(*args, **kwargs) File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 416, in bulk_create self.model._base_manager._insert(objs_without_pk, fields=[f for f in fields if not isinstance(f, AutoField)], using=self.db) File "/Library/Python/2.7/site-packages/django/db/models/manager.py", line 203, in _insert return insert_query(self.model, objs, fields, **kwargs) File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 1576, in insert_query return query.get_compiler(using=using).execute_sql(return_id) File "/Library/Python/2.7/site-packages/django/db/models/sql/compiler.py", line 910, in execute_sql cursor.execute(sql, params) File "/Library/Python/2.7/site-packages/django/db/backends/util.py", line 40, in execute return self.cursor.execute(sql, params) File "/Library/Python/2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute return self.cursor.execute(query, args) django.db.utils.DatabaseError: value too long for type character varying(50)
MySQL:
Creating tables ... Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line utility.execute() File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv self.execute(*args, **options.__dict__) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute output = self.handle(*args, **options) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle return self.handle_noargs(**options) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 110, in handle_noargs emit_post_sync_signal(created_models, verbosity, interactive, db) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/core/management/sql.py", line 189, in emit_post_sync_signal interactive=interactive, db=db) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 172, in send response = receiver(signal=self, sender=sender, **named) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/contrib/auth/management/__init__.py", line 54, in create_permissions auth_app.Permission.objects.bulk_create(objs) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/models/manager.py", line 140, in bulk_create return self.get_query_set().bulk_create(*args, **kwargs) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/models/query.py", line 416, in bulk_create self.model._base_manager._insert(objs_without_pk, fields=[f for f in fields if not isinstance(f, AutoField)], using=self.db) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/models/manager.py", line 203, in _insert return insert_query(self.model, objs, fields, **kwargs) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/models/query.py", line 1576, in insert_query return query.get_compiler(using=using).execute_sql(return_id) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 910, in execute_sql cursor.execute(sql, params) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/backends/util.py", line 40, in execute return self.cursor.execute(sql, params) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 114, in execute return self.cursor.execute(query, args) File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/MySQLdb/cursors.py", line 176, in execute if not self._defer_warnings: self._warning_check() File "/Users/elena/.virtualenvs/wc/lib/python2.7/site-packages/MySQLdb/cursors.py", line 92, in _warning_check warn(w[-1], self.Warning, 3) _mysql_exceptions.Warning: Data truncated for column 'name' at row 13
What is this error?
It is caused by contenttypes.name
, see SO:
http://stackoverflow.com/questions/10855978/heroku-and-django-value-too-long-for-type-character-varying50
Easily replicated:
class MyModel(models.Model): class Meta: verbose_name = "soem ridiculously long verbose name that is out of control"
This is not serious. It's just not obvious.
Change History (14)
comment:1 Changed 11 years ago by
Component: | Uncategorized → Database layer (models, ORM) |
---|
comment:2 Changed 11 years ago by
Component: | Database layer (models, ORM) → contrib.auth |
---|---|
Triage Stage: | Unreviewed → Accepted |
Type: | Uncategorized → Bug |
comment:5 Changed 11 years ago by
I added a simple validation before bulk_creation and a hint to the verbose_name
see: https://github.com/django/django/pull/1140
comment:7 Changed 11 years ago by
Has patch: | set |
---|---|
Needs tests: | set |
comment:8 Changed 10 years ago by
Cc: | kerry@… added |
---|
This also applies with a very similar error if you create your own Model permissions in Meta with a description over 50 Chars,
class Meta: permissions = ( ("view_desks", "Can view desks"), ("track_attendance", "Can track attended/no-show with this unfeasibly long description of over 50 Chars"), )
I've added this comment in case it's useful to someone else following the same route as me when identifying the problem.
Would it make sense to fix under this ticket or shall I put in a new ticket?
comment:9 Changed 10 years ago by
Related to #18959 that tracks the verbose_name errors
comment:10 Changed 10 years ago by
Ok, the problem is a bit more complex, and the abovementioned patch does not fix it.
The problem is that verbose_name is used to generate the auth_permission table; the "name" field in that table is set to varchar(50) (at least on PostgreSQL), but this record actually includes sentences ("Can add <verbose_name>", "Can delete <verbose_name>" and so on); so the actual practical limit is 39 characters for verbose_name. This is a weird number, common knowledge is that verbose_name can be up to 50 characters.
So the real fix is either to widen that field to 61 or more (50 + "Can delete ", which is 11 characters), or document that the limit is 39 on non-sqlite backends (sqlite doesn't really enforce limits to text fields).
I have a test and a fix for the validator to spot values that are too long, but there's no point in submitting a pull request if this point isn't settled first.
comment:11 Changed 10 years ago by
Resolution: | → duplicate |
---|---|
Status: | new → closed |
comment:12 Changed 10 years ago by
Resolution: | duplicate |
---|---|
Status: | closed → new |
comment:13 Changed 10 years ago by
Owner: | changed from nobody to toyg |
---|---|
Status: | new → assigned |
Ok, using this bug to track *validation* only - the actual limit will stay at 39 as per #8162.
comment:14 Changed 10 years ago by
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Yes, I've hit that several times myself. It's annoying. syncdb crashes because it tries to create a permission with a name that's longer than 50 characters.
Possible solutions: