2016-06-15 62 views
2

執行任何遷移命令時,我掙扎在Django的調試一個模糊的錯誤消息:Django的類型錯誤:「模型庫」對象不是可迭代

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 

我跟蹤這個問題到的一個我的應用程序,刪除它清除錯誤。但是,上述錯誤並不能幫助我理解問題。運行服務器正常工作,沒有錯誤輸出。 https://github.com/django/django/blob/master/django/db/migrations/operations/models.py#L83

這個錯誤是什麼有關:

錯誤正在從這一行Django的產生?該應用程序本身不會產生任何錯誤和運行良好,給出這個錯誤的應用程序是reputation

環境:

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 

聲譽遷移:

# -*- 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'), 
     ), 
    ] 
# -*- 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) 
    ] 
# -*- 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')]), 
     ), 
    ] 

回答

5

在第一次遷移:

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

您需要更改bases=(models.Model),bases=(models.Model,),(注意額外的逗號)。這將使bases成爲包含基類Model類的元組,而不僅僅是模型類。

我不確定您的遷移將如何進入此狀態。你是否手動更改遷移?您可能想要將Django升級到最新的1.8.x版本,可能是因爲修復了一個bug。

相關問題