1. Always migrating contenttypes before trying to create.
2. Only trying to create if contenttypes has already been migrated.
{{{
$ ./manage.py migrate <myapp>
Operations to perform:
Apply all migrations: <myapp>
Running migrations:
<migrations - all successful>
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File ".../django/django/core/management/__init__.py", line 427, in
execute_from_command_line
utility.execute()
File ".../django/django/core/management/__init__.py", line 419, in
execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File ".../django/django/core/management/base.py", line 288, in
run_from_argv
self.execute(*args, **options.__dict__)
File ".../django/django/core/management/base.py", line 337, in execute
output = self.handle(*args, **options)
File ".../django/django/core/management/commands/migrate.py", line 149,
in handle
emit_post_migrate_signal(created_models, self.verbosity,
self.interactive, connection.alias)
File ".../django/django/core/management/sql.py", line 246, in
emit_post_migrate_signal
using=db)
File ".../django/django/dispatch/dispatcher.py", line 198, in send
response = receiver(signal=self, sender=sender, **named)
File ".../django/django/contrib/auth/management/__init__.py", line 85,
in create_permissions
ctype = ContentType.objects.db_manager(using).get_for_model(klass)
File ".../django/django/contrib/contenttypes/models.py", line 49, in
get_for_model
defaults={'name': smart_text(opts.verbose_name_raw)},
File ".../django/django/db/models/manager.py", line 92, in
manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File ".../django/django/db/models/query.py", line 417, in get_or_create
return self.get(**lookup), False
File ".../django/django/db/models/query.py", line 346, in get
num = len(clone)
File ".../django/django/db/models/query.py", line 122, in __len__
self._fetch_all()
File ".../django/django/db/models/query.py", line 961, in _fetch_all
self._result_cache = list(self.iterator())
File ".../django/django/db/models/query.py", line 265, in iterator
for row in compiler.results_iter():
File ".../django/django/db/models/sql/compiler.py", line 694, in
results_iter
for rows in self.execute_sql(MULTI):
File ".../django/django/db/models/sql/compiler.py", line 780, in
execute_sql
cursor.execute(sql, params)
File ".../django/django/db/backends/utils.py", line 77, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File ".../django/django/db/backends/utils.py", line 61, in execute
return self.cursor.execute(sql, params)
File ".../django/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File ".../django/django/db/backends/utils.py", line 61, in execute
return self.cursor.execute(sql, params)
File ".../django/django/db/backends/sqlite3/base.py", line 479, in
execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: django_content_type
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/22411>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0
Comment:
I would lean towards number 2 (Only trying to create if contenttypes has
already been migrated) because explicit is better than implicit.
--
Ticket URL: <https://code.djangoproject.com/ticket/22411#comment:1>
* stage: Unreviewed => Accepted
--
Ticket URL: <https://code.djangoproject.com/ticket/22411#comment:2>
Comment (by melinath):
One option would be to always have a dependency on contenttypes in initial
migrations:
{{{
dependencies = [
('contenttypes', '__first__'),
]
}}}
Untested, but I think it would work.
--
Ticket URL: <https://code.djangoproject.com/ticket/22411#comment:3>
* cc: timo (added)
Comment:
I don't think adding a dependency on `contenttypes` would be wise since
the app should be optional and if we added that then if
`django.contrib.contenttypes` isn't in `INSTALLED_APPS`, you'd get an
error when migrating: `ValueError: Dependency on unknown app
contenttypes`. This raises a more general issue that unlike the
`post_syncdb` signal, when `post_migrate` is fired there's no guarantee
that the tables for all other apps will exist. I'm not sure if there's an
existing method to check whether or not a model's table has been created.
--
Ticket URL: <https://code.djangoproject.com/ticket/22411#comment:4>
Comment (by melinath):
This *should* be resolved by #22485, but I can't test myself due to the
introduction of #22563.
--
Ticket URL: <https://code.djangoproject.com/ticket/22411#comment:5>
Comment (by timo):
It still appears an issue, but I wonder if we should just document this or
throw a more helpful error message?
--
Ticket URL: <https://code.djangoproject.com/ticket/22411#comment:6>
* status: new => closed
* resolution: => fixed
Comment:
In [changeset:"7a259008a76c5bcd6c1e5ba3a45d17a6184c4242"]:
{{{
#!CommitTicketReference repository=""
revision="7a259008a76c5bcd6c1e5ba3a45d17a6184c4242"
Fixed #22411: Throw a more helpful error if contenttypes doesn't exist.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/22411#comment:7>
Comment (by Andrew Godwin <andrew@…>):
In [changeset:"c5578ba9fa052a814c27fe0069f98ed994751634"]:
{{{
#!CommitTicketReference repository=""
revision="c5578ba9fa052a814c27fe0069f98ed994751634"
[1.7.x] Fixed #22411: Throw a more helpful error if contenttypes doesn't
exist.
Conflicts:
django/contrib/contenttypes/models.py
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/22411#comment:8>