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