Opened 12 years ago

Closed 11 years ago

Last modified 11 years ago

#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 Thejaswi Puthraya, 12 years ago

Component: UncategorizedDatabase layer (models, ORM)

comment:2 by Aymeric Augustin, 12 years ago

Component: Database layer (models, ORM)contrib.auth
Triage Stage: UnreviewedAccepted
Type: UncategorizedBug

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:

  • improve the error message
  • display a warning and truncate the value
  • increase the size of the field to 200 characters (insert usual rant about lack of migrations in core here)

comment:5 by djangsters, 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:6 by Filipa Andrade, 11 years ago

Wouldn't it be good to have a test for this?

comment:7 by Filipa Andrade, 11 years ago

Has patch: set
Needs tests: set

comment:8 by kerry@…, 11 years ago

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 by rasca, 11 years ago

Related to #18959 that tracks the table names errors

Last edited 11 years ago by rasca (previous) (diff)

comment:10 by toyg, 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.

Last edited 11 years ago by toyg (previous) (diff)

comment:11 by toyg, 11 years ago

Resolution: duplicate
Status: newclosed

Duplicate of #8548 and #8162

comment:12 by toyg, 11 years ago

Resolution: duplicate
Status: closednew

comment:13 by toyg, 11 years ago

Owner: changed from nobody to toyg
Status: newassigned

Ok, using this bug to track *validation* only - the actual limit will stay at 39 as per #8162.

comment:14 by joaoxsouls <joaoxsouls@…>, 11 years ago

Resolution: fixed
Status: assignedclosed

In 1ab27e9a65015373a49688f3ff6723cf85d5de56:

Fixed #18866 -- added validation error for verbose_name longer than 39 characters

Added a validation error check when creating the permissions for model, to avoid
cryptic database error when the verbose_name is longer than 39 characters
thanks elena for reporting it

comment:15 by Marc Tamlyn <marc.tamlyn@…>, 11 years ago

In 8ce3c3a9282ac19282060ddf6928b34a09d26672:

Merge pull request #1733 from joaoxsouls/#18866

Fixed #18866 -- added validation error for verbose_name longer than 39 characters

comment:16 by Tim Graham <timograham@…>, 11 years ago

In 91c77eeab837ff793311ac5b0321015a4e66d6da:

Avoided hardcoding Permission.name max_length

refs #18866.

Note: See TracTickets for help on using tickets.
Back to Top