#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 by , 12 years ago
Component: | Uncategorized → Database layer (models, ORM) |
---|
comment:2 by , 12 years ago
Component: | Database layer (models, ORM) → contrib.auth |
---|---|
Triage Stage: | Unreviewed → Accepted |
Type: | Uncategorized → Bug |
comment:5 by , 11 years ago
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 by , 11 years ago
Has patch: | set |
---|---|
Needs tests: | set |
comment:8 by , 11 years ago
Cc: | 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:10 by , 11 years ago
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 by , 11 years ago
Resolution: | → duplicate |
---|---|
Status: | new → closed |
comment:12 by , 11 years ago
Resolution: | duplicate |
---|---|
Status: | closed → new |
comment:13 by , 11 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
Ok, using this bug to track *validation* only - the actual limit will stay at 39 as per #8162.
comment:14 by , 11 years ago
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: