我如何修理我的Django“;ValueError:发现错误数量的约束“0”;迁移错误?
我正在使用Python3.7和Django。我尝试了这个解决方案,但仍然得到了同样的错误。我的一次迁移遇到了问题。我最近更新了我的模型的唯一约束我如何修理我的Django“;ValueError:发现错误数量的约束“0”;迁移错误?,django,python-3.x,migration,unique-constraint,Django,Python 3.x,Migration,Unique Constraint,我正在使用Python3.7和Django。我尝试了这个解决方案,但仍然得到了同样的错误。我的一次迁移遇到了问题。我最近更新了我的模型的唯一约束 class ArticleSumStatByHour(models.Model): total_score = models.DecimalField(default=0, max_digits=12, decimal_places=2, null=False) total_seconds_to_reach_fp = models.De
class ArticleSumStatByHour(models.Model):
total_score = models.DecimalField(default=0, max_digits=12, decimal_places=2, null=False)
total_seconds_to_reach_fp = models.DecimalField(default=0, max_digits=12, decimal_places=2, null=False)
num_articles = models.IntegerField(default=0, null=False)
hour_of_day = IntegerField(
null=False,
validators=[
MaxValueValidator(23),
MinValueValidator(0)
]
)
index = models.FloatField(default=0)
website = models.ForeignKey(website, on_delete=models.CASCADE, related_name='articlesumstatbyhoursub')
class Meta:
unique_together = ("hour_of_day","website")
这是我的迁移
...
class Migration(migrations.Migration):
dependencies = [
('articlesum', '0032_auto_20190808_1452'),
]
operations = [
migrations.AlterField(
model_name='articlesumstatbyhour',
name='website',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='articlesumstatbyhoursub', to='articlesum.website'),
),
migrations.AlterUniqueTogether(
name='articlesumstatbyhour',
unique_together={('hour_of_day','website')},
),
]
但当我运行迁移时,我遇到了一个令人困惑的错误,抱怨“ValueError:找到了错误数量(0)的约束”
(venv)localhost:articlesum\u项目davea$python manage.py迁移articlesum
要执行的操作:
应用所有迁移:articlesum
运行迁移:
正在应用articlesum.0033_auto_20190830_1128…回溯(最近一次调用):
文件“manage.py”,第21行,在
从命令行(sys.argv)执行命令
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/core/management/___init__.py”,第381行,从命令行执行
utility.execute()
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/core/management/______.py”,执行中第375行
self.fetch_命令(子命令)。从_argv(self.argv)运行_
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/core/management/base.py”,第316行,从_argv运行
self.execute(*args,**cmd_选项)
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/core/management/base.py”,第353行,在execute中
输出=self.handle(*args,**选项)
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/core/management/base.py”,第83行,包装
res=句柄函数(*args,**kwargs)
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/core/management/commands/migrate.py”,第203行,在handle中
假首字母=假首字母,
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/db/migrations/executor.py”,第117行,在migrate中
状态=self.\u迁移\u所有\u转发(状态,计划,完整计划,假=假,假首字母=假首字母)
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/db/migrations/executor.py”,第147行,全部向前迁移
state=self.apply\u迁移(state,migration,false=false,false\u initial=false\u initial)
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/db/migrations/executor.py”,第244行,在apply_migration中
state=migration.apply(状态,模式编辑器)
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/db/migrations/migration.py”,第124行,在apply中
操作。数据库转发(self.app\u标签、模式编辑器、旧状态、项目状态)
数据库中的文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/db/migrations/operations/models.py”,第514行
getattr(新的\模型。\元,self.option \名称,set()),
文件“/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site packages/django/db/backends/base/schema.py”,第356行,在alter_unique_中
self.\u delete\u组合索引(模型,字段,{'unique':True},self.sql\u delete\u unique)
文件“/Users/davea/Documents/workspace/articlesum\u project/venv/lib/python3.7/site packages/django/db/backends/base/schema.py”,第385行,在删除索引中
“,”。连接(列),
ValueError:为articlesum\u articlesumstatbyhour(网站id、已用时间(以秒为单位)、小时(以天为单位)找到了错误数量(0)的约束
为什么迁移无法创建我的唯一约束?当前迁移似乎正在查找数据库当前没有的上一个索引。因此,您需要在db表上设置最后一个唯一索引 每次更改表上的索引时,它都会检查其以前的索引并删除它。在您的情况下,它无法获取上一个索引
解决方案-1.您可以手动生成它2.或者还原到使用以前索引的代码并进行迁移。然后最后在代码中更改为新索引并运行迁移。(需要处理django_迁移文件)迁移中缺少一组括号,可能是因为您使用的是元组。请尝试
unique\u-together=[[“一天中的一小时”,“网站”]
或unique\u-together=[“一天中的一小时”,“网站”]
感谢您的建议,但遗憾的是,这两种方法都不起作用(都产生了相同的错误)在添加此约束之前,您有其他约束吗?不确定--我从离开项目的其他人那里继承了此代码库。有没有办法检查这类事情?是的,翻阅以前的迁移文件。我认为有一个悬而未决的问题,Django没有正确地删除约束。因此,您可能应该自己创建一个迁移文件,在该文件添加新约束之前删除先前的约束。
(venv) localhost:articlesum_project davea$ python manage.py migrate articlesum
Operations to perform:
Apply all migrations: articlesum
Running migrations:
Applying articlesum.0033_auto_20190830_1128...Traceback (most recent call last):
File "manage.py", line 21, in <module>
execute_from_command_line(sys.argv)
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/core/management/base.py", line 353, in execute
output = self.handle(*args, **options)
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/core/management/base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 203, in handle
fake_initial=fake_initial,
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/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 "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/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 "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
state = migration.apply(state, schema_editor)
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/db/migrations/migration.py", line 124, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/db/migrations/operations/models.py", line 514, in database_forwards
getattr(new_model._meta, self.option_name, set()),
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 356, in alter_unique_together
self._delete_composed_index(model, fields, {'unique': True}, self.sql_delete_unique)
File "/Users/davea/Documents/workspace/articlesum_project/venv/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 385, in _delete_composed_index
", ".join(columns),
ValueError: Found wrong number (0) of constraints for articlesum_articlesumstatbyhour(website_id, elapsed_time_in_seconds, hour_of_day)