我使用inspectdb创建了我的模型,当django生成以下内容时,它让我很奇怪,因为只有一个这样的索引,但我让它成为
unique_together =(('p_id','v_id','sku',),('p_id','v_id','sku',))
现在我正在尝试将'sku2'添加到此索引中,并且'migrate'失败并显示以下内容:
File "/home/user/.pyenv/versions/2.7.11/envs/master2/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 347, in _delete_composed_index
", ".join(columns),
ValueError: Found wrong number (2) of constraints for vendor_products(p_id, v_id, sku)
这是我的模特:
class Products(models.Model):
p_id = models.OneToOneField(MasterProducts, models.DO_NOTHING, db_column='p_id', primary_key=True)
v_id = models.ForeignKey('Sellers', models.DO_NOTHING, db_column='v_id')
sku = models.TextField()
sku2 = models.TextField(blank=True, null=True)
class Meta:
managed = True
db_table = 'products'
unique_together = (('p_id', 'v_id', 'sku',), ('p_id', 'v_id', 'sku',))
我尝试将unique_together更改为 (('p_id','v_id','sku',),)和('p_id','v_id','sku',) 结果相同。
我也尝试使用db手动删除唯一索引并使用django重新创建它,但它仍然不允许我添加sku2。
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:4)
我没有深入挖掘,但我的Django 1.8检查了一些资料。我认为这段代码是相同的。
我的猜测是你用这句话创造了错误的约束:
unique_together = (('p_id', 'v_id', 'sku',), ('p_id', 'v_id', 'sku',))
您已创建迁移并已应用它。它在数据库中创建了两个相同的约束。从技术上讲,这是允许的,但没有任何意义。
之后你试图改变它,在这里你因为django.db.backends.base.schema._delete_composed_index()
中的Django验证而得到错误 - 它从数据库中收集所有约束并验证只有一个:
def _delete_composed_index(self, model, fields, constraint_kwargs, sql):
columns = [model._meta.get_field(field).column for field in fields]
constraint_names = self._constraint_names(model, columns, **constraint_kwargs)
if len(constraint_names) != 1:
raise ValueError("Found wrong number (%s) of constraints for %s(%s)" % (
len(constraint_names),
model._meta.db_table,
", ".join(columns),
))
必须从同一模块的alter_unique_together
函数调用它。
那么,你现在该做什么?