[Django] #28489: AttributeError: 'NoneType' object has no attribute 'is_relation' - None is undefined

51 views
Skip to first unread message

Django

unread,
Aug 11, 2017, 10:54:00 PM8/11/17
to django-...@googlegroups.com
#28489: AttributeError: 'NoneType' object has no attribute 'is_relation' - None is
undefined
----------------------------------------+------------------------
Reporter: Python Force | Owner: nobody
Type: Bug | Status: new
Component: Migrations | Version: 1.11
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
----------------------------------------+------------------------
Hello,

Was going from Django version 1.10.7 to 1.11.4 and my migrations were
working in 1.10.7 and stopped in 1.11.4. All my migrations were migrated
before the upgrade. I went back to 1.10.7 and it was working again. Going
back to 1.11.4 same error.

{{{
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "[...]/venv/lib/python2.7/site-
packages/django/core/management/__init__.py", line 363, in
execute_from_command_line
utility.execute()
File "[...]/venv/lib/python2.7/site-
packages/django/core/management/__init__.py", line 355, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "[...]/venv/lib/python2.7/site-
packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "[...]/venv/lib/python2.7/site-
packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "[...]/venv/lib/python2.7/site-
packages/django/core/management/commands/migrate.py", line 163, in handle
pre_migrate_state =
executor._create_project_state(with_applied_migrations=True)
File "/[...]/venv/lib/python2.7/site-
packages/django/db/migrations/executor.py", line 81, in
_create_project_state
migration.mutate_state(state, preserve=False)
File "[...]/venv/lib/python2.7/site-
packages/django/db/migrations/migration.py", line 92, in mutate_state
operation.state_forwards(self.app_label, new_state)
File "[...]/venv/lib/python2.7/site-
packages/django/db/migrations/operations/fields.py", line 150, in
state_forwards
delay = not old_field.is_relation
AttributeError: 'NoneType' object has no attribute 'is_relation'
}}}

When I look in the fields.py file I can see on the line 139 a function:

{{{
def state_forwards(self, app_label, state):
new_fields = []
old_field = None
for name, instance in state.models[app_label,
self.model_name_lower].fields:
if name != self.name:
new_fields.append((name, instance))
else:
old_field = instance
state.models[app_label, self.model_name_lower].fields = new_fields
# Delay rendering of relationships if it's not a relational field
delay = not old_field.is_relation
state.reload_model(app_label, self.model_name_lower, delay=delay)
}}}

Found out that it was crashing on 1 of the model fields that are not
existing anymore in the database. I added a line to print the name of the
model and field to find out what is causing the crash.

If old_field = None then it is calling a method on empty variable and it
throws and error.

Added this line

{{{
print app_label + " " + self.model_name_lower + " " + self.name
}}}

{{{
def state_forwards(self, app_label, state):
new_fields = []
old_field = None
print app_label + " " + self.model_name_lower + " " + self.name
for name, instance in state.models[app_label,
self.model_name_lower].fields:
if name != self.name:
new_fields.append((name, instance))
else:
old_field = instance
state.models[app_label, self.model_name_lower].fields = new_fields
# Delay rendering of relationships if it's not a relational field
delay = not old_field.is_relation
state.reload_model(app_label, self.model_name_lower, delay=delay)
}}}

The Output was

{{{
cars video subtitle_url
cars photos gear
cars news tags
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "[...]/venv/lib/python2.7/site-
packages/django/core/management/__init__.py", line 363, in
execute_from_command_line
utility.execute()
File "[...]/venv/lib/python2.7/site-
packages/django/core/management/__init__.py", line 355, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "[...]/venv/lib/python2.7/site-
packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "[...]/venv/lib/python2.7/site-
packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "[...]/venv/lib/python2.7/site-
packages/django/core/management/commands/migrate.py", line 163, in handle
pre_migrate_state =
executor._create_project_state(with_applied_migrations=True)
File "/[...]/venv/lib/python2.7/site-
packages/django/db/migrations/executor.py", line 81, in
_create_project_state
migration.mutate_state(state, preserve=False)
File "[...]/venv/lib/python2.7/site-
packages/django/db/migrations/migration.py", line 92, in mutate_state
operation.state_forwards(self.app_label, new_state)
File "[...]/venv/lib/python2.7/site-
packages/django/db/migrations/operations/fields.py", line 150, in
state_forwards
delay = not old_field.is_relation
AttributeError: 'NoneType' object has no attribute 'is_relation'
}}}

That means it crashed on App[Cars] Model[News] and Field[Tags] - tags were
not in the DB anymore long time ago. I found this migration:

{{{
migrations.RemoveField(
model_name='news',
name='tags',
),
}}}

And deleted it.

After that the migration ran 100% and I am fully functional on 1.11.4.

For the record the function in 1.10.7 is - and that is working

{{{
def state_forwards(self, app_label, state):
new_fields = []
for name, instance in state.models[app_label,
self.model_name_lower].fields:
if name != self.name:
new_fields.append((name, instance))
state.models[app_label, self.model_name_lower].fields = new_fields
state.reload_model(app_label, self.model_name_lower)
}}}

1. fields.py
https://github.com/django/django/blob/master/django/db/migrations/operations/fields.py

2. Who was working on it
https://github.com/django/django/commit/45ded053b1f4320284aa5dac63052f6d1baefea9

Hope that helps.

Radek

--
Ticket URL: <https://code.djangoproject.com/ticket/28489>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Aug 12, 2017, 8:43:06 AM8/12/17
to django-...@googlegroups.com
#28489: AttributeError: 'NoneType' object has no attribute 'is_relation' - None is
undefined
------------------------------+--------------------------------------

Reporter: Python Force | Owner: nobody
Type: Bug | Status: closed
Component: Migrations | Version: 1.11
Severity: Normal | Resolution: duplicate

Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
------------------------------+--------------------------------------
Changes (by Tim Graham):

* status: new => closed
* resolution: => duplicate


Comment:

Looks like a duplicate of #28073. If you can provide steps to reproduce
such as a sample project, please reopen that ticket.

--
Ticket URL: <https://code.djangoproject.com/ticket/28489#comment:1>

Reply all
Reply to author
Forward
0 new messages