Django 填充数据库数据迁移失败



我在 django 中得到了以下迁移:

# Generated by Django 2.2.12 on 2020-05-20 16:22
from django.db import migrations
import re

def numeric_version(version):
digits = 4
pattern = r"(d+).(d+).(d+)"
major, minor, patch = tuple(map(int, re.findall(pattern, version)[0]))
return patch + pow(10, digits) * minor + pow(10, 2 * digits) * major

def insert_numeric_software_version(apps, scheme_editor):
Device = apps.get_model("devices", "Device")
for device in Device.objects.all():
if device.software_version is not None:
device.numeric_software_version = numeric_version(device.software_version)

class Migration(migrations.Migration):
dependencies = [
("devices", "0037_device_numeric_software_version"),
]
operations = [insert_numeric_software_version]

它应该用数字字段填充数据库中的"numeric_software_version"字段。 在模型中,此字段为:

numeric_software_version = models.IntegerField(default=0)

当我运行"python manage.py migrate"时,出现以下错误:

File "manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 364, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 234, in handle
fake_initial=fake_initial,
File "/usr/local/lib/python3.6/site-packages/django/db/migrations/executor.py", line 117, in migrate
state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/usr/local/lib/python3.6/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/usr/local/lib/python3.6/site-packages/django/db/migrations/executor.py", line 245, in apply_migration
state = migration.apply(state, schema_editor)
File "/usr/local/lib/python3.6/site-packages/django/db/migrations/migration.py", line 114, in apply
operation.state_forwards(self.app_label, project_state)
AttributeError: 'function' object has no attribute 'state_forwards'

我不知道我做错了什么。除了迁移之外,我检查了我的numeric_version号码,这应该有效。有什么提示吗?

查看文档,我想您应该更改:

operations = [insert_numeric_software_version]

自:

operations = [migrations.RunPython(insert_numeric_software_version)]

在列表中声明第二个操作而不是元组时,也会发生此错误。 例如错误地使用这个

class Migration(migrations.Migration):
dependencies = [('app', '0001_initial'),]
operations = [migrations.RunPython(load_fixture), clear_fixture_files]

而不是

class Migration(migrations.Migration):
dependencies = [('app', '0001_initial'),]
operations = [migrations.RunPython(load_fixture, clear_fixture_files),]

最新更新