#20978: Cannot migrate if on_delete=models.SET_NULL ----------------------------+-------------------- Reporter: MarkusH | Owner: Type: Bug | Status: new Component: Migrations | Version: master Severity: Normal | Keywords: Triage Stage: Unreviewed | Has patch: 0 Easy pickings: 0 | UI/UX: 0 ----------------------------+-------------------- Given the following models, the `migrate` step fails with `'module' object has no attribute 'set_on_delete'`.
{{{ # -*- coding: utf-8 -*- from django.db import models from django.utils.encoding import python_2_unicode_compatible @python_2_unicode_compatible class MyModel(models.Model): name = models.CharField('Name', max_length=50, unique=True) text = models.TextField('Text', blank=True, null=True) class Meta: verbose_name = 'My “fancy” Model' verbose_name_plural = 'My “fancy” Models' def __str__(self): return self.name @python_2_unicode_compatible class OtherModel(models.Model): mymodel = models.ForeignKey(MyModel, null=True, on_delete=models.SET_NULL) value = models.IntegerField('Value', blank=True, null=False, default=50) class Meta: verbose_name = 'Other Model' verbose_name_plural = 'Other Models' def __str__(self): return '%(mymodel)s %(value)d' % { 'mymodel': self.mymodel.name, 'value': self.value, } }}} The migration file looks like {{{ # encoding: utf8 from django.db import models, migrations import django.db.models.deletion class Migration(migrations.Migration): dependencies = [(u'something', '0001_initial')] operations = [ migrations.CreateModel( fields = [(u'id', models.AutoField(verbose_name=u'ID', serialize=False, auto_created=True, primary_key=True),), ('name', models.CharField(unique=True, max_length=50, verbose_name='Name'),), ('text', models.TextField(null=True, verbose_name='Text', blank=True),)], bases = (models.Model,), options = {u'verbose_name': 'My \xe2\x80\x9cfancy\xe2\x80\x9d Model', u'verbose_name_plural': 'My \xe2\x80\x9cfancy\xe2\x80\x9d Models'}, name = 'MyModel', ), migrations.CreateModel( fields = [(u'id', models.AutoField(verbose_name=u'ID', serialize=False, auto_created=True, primary_key=True),), ('mymodel', models.ForeignKey(to=u'something.MyModel', to_field=u'id', null=True, on_delete=django.db.models.deletion.set_on_delete),), ('value', models.IntegerField(default=50, verbose_name='Value', blank=True),)], bases = (models.Model,), options = {u'verbose_name': 'Other Model', u'verbose_name_plural': 'Other Models'}, name = 'OtherModel', ), ] }}} Migrating with Python 3.3: {{{ Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/home/markus/.venvs/django-master- py3/src/django/django/core/management/__init__.py", line 397, in execute_from_command_line utility.execute() File "/home/markus/.venvs/django-master- py3/src/django/django/core/management/__init__.py", line 390, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/markus/.venvs/django-master- py3/src/django/django/core/management/base.py", line 242, in run_from_argv self.execute(*args, **options.__dict__) File "/home/markus/.venvs/django-master- py3/src/django/django/core/management/base.py", line 289, in execute output = self.handle(*args, **options) File "/home/markus/.venvs/django-master- py3/src/django/django/core/management/commands/migrate.py", line 52, in handle executor = MigrationExecutor(connection, self.migration_progress_callback) File "/home/markus/.venvs/django-master- py3/src/django/django/db/migrations/executor.py", line 14, in __init__ self.loader.load_disk() File "/home/markus/.venvs/django-master- py3/src/django/django/db/migrations/loader.py", line 77, in load_disk migration_module = import_module("%s.%s" % (module_name, migration_name)) File "/home/markus/.venvs/django-master- py3/lib/python3.3/importlib/__init__.py", line 90, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1586, in _gcd_import File "<frozen importlib._bootstrap>", line 1567, in _find_and_load File "<frozen importlib._bootstrap>", line 1534, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 586, in _check_name_wrapper File "<frozen importlib._bootstrap>", line 1024, in load_module File "<frozen importlib._bootstrap>", line 1005, in load_module File "<frozen importlib._bootstrap>", line 562, in module_for_loader_wrapper File "<frozen importlib._bootstrap>", line 870, in _load_module File "<frozen importlib._bootstrap>", line 313, in _call_with_frames_removed File "/home/markus/Coding/django- testing/example/something/migrations/0001_initial.py", line 6, in <module> class Migration(migrations.Migration): File "/home/markus/Coding/django- testing/example/something/migrations/0001_initial.py", line 20, in Migration fields = [('id', models.AutoField(serialize=False, auto_created=True, primary_key=True, verbose_name='ID'),), ('mymodel', models.ForeignKey(t_field='id', on_delete=django.db.models.deletion.set_on_delete, null=True, to='something.MyModel'),), ('value', models.IntegerField(default=50, bank=True, verbose_name='Value'),)], AttributeError: 'module' object has no attribute 'set_on_delete' }}} Migrating with Python 2.7.5: {{{ Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/home/markus/.venvs/django-master- py27/src/django/django/core/management/__init__.py", line 397, in execute_from_command_line utility.execute() File "/home/markus/.venvs/django-master- py27/src/django/django/core/management/__init__.py", line 390, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/markus/.venvs/django-master- py27/src/django/django/core/management/base.py", line 242, in run_from_argv self.execute(*args, **options.__dict__) File "/home/markus/.venvs/django-master- py27/src/django/django/core/management/base.py", line 289, in execute output = self.handle(*args, **options) File "/home/markus/.venvs/django-master- py27/src/django/django/core/management/commands/migrate.py", line 52, in handle executor = MigrationExecutor(connection, self.migration_progress_callback) File "/home/markus/.venvs/django-master- py27/src/django/django/db/migrations/executor.py", line 14, in __init__ self.loader.load_disk() File "/home/markus/.venvs/django-master- py27/src/django/django/db/migrations/loader.py", line 77, in load_disk migration_module = import_module("%s.%s" % (module_name, migration_name)) File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module __import__(name) File "/home/markus/Coding/django- testing/example/something/migrations/0001_initial.py", line 6, in <module> class Migration(migrations.Migration): File "/home/markus/Coding/django- testing/example/something/migrations/0001_initial.py", line 18, in Migration fields = [(u'id', models.AutoField(verbose_name=u'ID', serialize=False, auto_created=True, primary_key=True),), ('mymodel', models.ForeignKey(to=u'something.MyModel', to_field=u'id', null=True, on_delete=django.db.models.deletion.set_on_delete),), ('value', models.IntegerField(default=50, verbose_name='Value', blank=True),)], AttributeError: 'module' object has no attribute 'set_on_delete' }}} -- Ticket URL: <https://code.djangoproject.com/ticket/20978> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/050.b67d43e6733effd2bf9ebea40175fcb8%40djangoproject.com. For more options, visit https://groups.google.com/groups/opt_out.