2

I'm struggling to debug a vague error message in Django when executing any migration command:

Operations to perform:
  Synchronize unmigrated apps: rest_framework_docs, staticfiles, django_coverage, django_extensions, storages, corsheaders, gis, templated_email, rest_framework, django_mptt_admin, opbeat.contrib.django, grappelli, permissions, django_nose, django_markdown, messages, common
  Apply all migrations: contenttypes, auth, badges, reputation, geodata,  comments, sites, users, votes, watchers, library, sessions, admin, oauth2_provider
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  No migrations to apply.

    Traceback (most recent call last):
      File "manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
      File "/Users/user/Documents/workspace/app-api/env/lib/python3.4/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
        utility.execute()
      File "/Users/user/Documents/workspace/app-api/env/lib/python3.4/site-packages/django/core/management/__init__.py", line 346, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/Users/user/Documents/workspace/app-api/env/lib/python3.4/site-packages/django/core/management/base.py", line 394, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/Users/user/Documents/workspace/app-api/env/lib/python3.4/site-packages/django/core/management/base.py", line 445, in execute
        output = self.handle(*args, **options)
      File "/Users/user/Documents/workspace/app-api/env/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 205, in handle
        executor.loader.project_state(),
      File "/Users/user/Documents/workspace/app-api/env/lib/python3.4/site-packages/django/db/migrations/loader.py", line 353, in project_state
        return self.graph.make_state(nodes=nodes, at_end=at_end, real_apps=list(self.unmigrated_apps))
      File "/Users/user/Documents/workspace/app-api/env/lib/python3.4/site-packages/django/db/migrations/graph.py", line 231, in make_state
        project_state = self.nodes[node].mutate_state(project_state, preserve=False)
      File "/Users/user/Documents/workspace/app-api/env/lib/python3.4/site-packages/django/db/migrations/migration.py", line 83, in mutate_state
        operation.state_forwards(self.app_label, new_state)
      File "/Users/user/Documents/workspace/user-api/env/lib/python3.4/site-packages/django/db/migrations/operations/models.py", line 52, in state_forwards
        tuple(self.bases),
    TypeError: 'ModelBase' object is not iterable

I've tracked the problem down to one of my apps, removing it clears the error. However, the error above does not help me understand the issue. Runserver works fine with no errors output.

The error is being generated from this line in Django: https://github.com/django/django/blob/master/django/db/migrations/operations/models.py#L83

What does this error relate to? The app itself does not generate any errors and runs fine, the app which gives this error is reputation.

Environment:

pillow==3.2.0
Django==1.8.7
psycopg2
Sphinx==1.2.3
django-mptt==0.7.2
sphinx_rtd_theme==0.1.6
django_extensions==1.3.3
django-mptt-admin==0.2.1
django-debug-toolbar==1.4
djangorestframework==3.3.3
django-oauth-toolkit==0.8.1
rest_condition==1.0.1
gevent==1.1rc3
gunicorn==19.3.0
django-cors-headers==1.1.0
django-simple-email-confirmation==0.12
itsdangerous==0.24
django-grappelli==2.7.1
numpy==1.11.0

reputation migrations:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals



class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('contenttypes', '0002_remove_content_type_name'),
    ]

    operations = [
        migrations.CreateModel(
            name='Reputation',
            fields=[
                ('created', django_extensions.db.fields.CreationDateTimeField(default=django.utils.timezone.now, blank=True, editable=False, verbose_name='created')),
                ('modified', django_extensions.db.fields.ModificationDateTimeField(default=django.utils.timezone.now, blank=True, editable=False, verbose_name='modified')),
                ('id', models.UUIDField(primary_key=True, unique=True,
                ('reputation', models.PositiveIntegerField(default=0)),
                ('dimension', models.CharField(max_length=2, blank=True, null=True)),
                ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='reputation_set')),
            ],
            options={
                'verbose_name': 'Reputation',
            },
        ),
        migrations.CreateModel(
            name='ReputationAction',
            fields=[
                ('created', django_extensions.db.fields.CreationDateTimeField(default=django.utils.timezone.now, blank=True, editable=False, verbose_name='created')),
                ('modified', django_extensions.db.fields.ModificationDateTimeField(default=django.utils.timezone.now, blank=True, editable=False, verbose_name='modified')),
                ('id', models.UUIDField(primary_key=True, unique=True, 
                ('action_type', models.CharField(max_length=10, blank=True, null=True)),
                ('value', models.IntegerField(default=0)),
                ('capped', models.BooleanField(default=0)),
                ('object_id', models.UUIDField()),
                ('content_type', models.ForeignKey(to='contenttypes.ContentType')),
                ('originating_user', models.ForeignKey(related_name='originating_user', to=settings.AUTH_USER_MODEL, null=True)),
                ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='target_user')),
            ],
            options={
                'verbose_name': 'Reputation Action',
            },
            bases=(models.Model),
        ),
    ]

2:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
from django.conf import settings


class Migration(migrations.Migration):

    dependencies = [
        ('reputation', '0001_initial'),
    ]

    operations = [
        migrations.AlterField(
            model_name='reputationaction',
            name='user',
            field=models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='reputation_action'),
        ),
    ]

3

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


def dedupe_reputation_actions(apps, schema_editor):
    Reputation = apps.get_model('reputation', 'Reputation')

    qs = Reputation.objects.all().values('user', 'dimension')\
        .annotate(total=models.Count('user'))\
        .filter(total__gt=1)

    for dupe in qs:
        reps = list(Reputation.objects.filter(user=dupe['user'], dimension=dupe['dimension']))

        for rep in reps[1:]:
            rep.delete()


class Migration(migrations.Migration):

    dependencies = [
        ('reputation', '0002_auto_20151117_1108'),
    ]

    operations = [
        migrations.RunPython(dedupe_reputation_actions)
    ]

4

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('reputation', '0003_auto_20160302_1749'),
    ]

    operations = [
        migrations.AlterUniqueTogether(
            name='reputation',
            unique_together=set([('user', 'dimension')]),
        ),
    ]

1 Answer 1

7

In your first migration:

migrations.CreateModel(
    name='ReputationAction',
    ...
    bases=(models.Model),
),

You need to change bases=(models.Model), to bases=(models.Model,), (note the extra comma). This will make bases a tuple containing the base Model class, rather than just the model class.

I'm not sure how your migrations would get into this state. Did you change the migrations manually? You might want to upgrade Django to the latest 1.8.x version, maybe there was a bug that has since been fixed.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.