我正面临着我的一个django模型的奇怪情况。 我使用Django 1.10.3与python 3.5.2。django迁移不可能因为字段默认值中的错误?
的模型看起来像这样(为了清楚而简化):
class Report(models.Model):
date = models.FieldDate()
def fieldA_default(self):
return MyObject.objects.filter(date=self.date).count()
fieldA = models.IntegerField(default=fieldA_default)
我有创建模型,并增加了该领域,通过使用./manage.py makemigrations
django的自动生成的初始迁移。
我将此代码提交给我的git仓库,并将其部署到我的生产服务器,但实际上并未使用该模型(数据库中没有Report
对象)。 我刚刚发现此代码不正确(django set default value of a model field to a self attribute),并决定替代save()
。
但是,当我更改默认从fieldA_default
到0
,运行./manage.py makemigrations
因为它试图运行旧的默认值功能fieldA_default
失败。在尝试了几个选项后,我最终决定完全删除模型。但这不起作用,因为makemigrations
仍然试图运行相同的功能。
这里是makemigrations
回溯时,我只需删除模式:
Traceback (most recent call last):
File "./manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
utility.execute()
File "venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 359, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "venv/lib/python3.5/site-packages/django/core/management/base.py", line 294, in run_from_argv
self.execute(*args, **cmd_options)
File "venv/lib/python3.5/site-packages/django/core/management/base.py", line 345, in execute
output = self.handle(*args, **options)
File "venv/lib/python3.5/site-packages/django/core/management/commands/makemigrations.py", line 95, in handle
loader = MigrationLoader(None, ignore_no_migrations=True)
File "venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 52, in __init__
self.build_graph()
File "venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 197, in build_graph
self.load_disk()
File "venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 108, in load_disk
migration_module = import_module("%s.%s" % (module_name, migration_name))
File "venv/lib/python3.5/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 665, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "xxx/reporting/migrations/0001_initial.py", line 9, in <module>
class Migration(migrations.Migration):
File "xxx/reporting/migrations/0001_initial.py", line 22, in Migration
('fieldA', models.IntegerField(default=reporting.models.Report.fieldA_default)),
AttributeError: module 'reporting.models' has no attribute 'Report'
我有几个问题:
- 为什么Django的运行,即使我这个“老”的代码删除模型?
- 我是如何设法将这个无效代码放入没有Django尖叫的迁移中的?
- 我该如何解决这种情况,以免打破我的生产服务器?我完全放弃模型并重建模型并没有问题,但我似乎没有被允许这样做。
你有没有尝试过的应用程序迁移到零,删除迁移,并再次运行'makemigrations'? – schwobaseggl
我需要的信息进行调试,请进入你的数据库表django_migrations,并检查是否为您的应用程序的“0001_initial”行存在。将此添加到您的帖子中。 – Fian
@schwobaseggl它看起来像你的建议的工作。我跑'./manage.py情况下迁移报告zero'随后'./manage.py makemigrations reporting'和我没有错误。谢谢你的帮助!如果你添加这个作为答案,我会接受:) –