【问题标题】:Django 1.9 can't modify unique_together (ValueError) wrong number of constrainsDjango 1.9 无法修改 unique_together (ValueError) 错误的约束数量
【发布时间】:2016-03-27 19:12:33
【问题描述】:

我使用inspectdb创建了我的模型,当django生成以下内容时让我感到奇怪,因为只有一个这样的索引,但我让它成为了

unique_together = (('p_id', 'v_id', 'sku',), ('p_id', 'v_id', 'sku',))

现在我正在尝试将“sku2”添加到此索引中,而“迁移”失败并显示以下内容:

 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。

为什么会这样,我该如何解决?

【问题讨论】:

  • 通过关键字我猜你正在使用django-south。不要使用它。它从 1.7 开始包含在 Django 中。
  • 使用迁移,我改变了它
  • 为什么要设置两次约束?
  • 我没有'inspectdb'这样制作,它似乎与问题无关
  • 您的示例有问题。模型ProductsProducts 具有一对一的关系?它甚至不会编译。请检查。

标签: python django django-migrations


【解决方案1】:

我没有深入挖掘它,而是检查了一些我的 Django 1.8 的源代码。我认为这段代码部分是一样的。

我的猜测是您使用此语句创建了错误的约束:

unique_together = (('p_id', 'v_id', 'sku',), ('p_id', 'v_id', 'sku',))

您已创建迁移并应用它。它在数据库中创建了两个相同的约束。技术上是允许的,但没有意义。

之后您尝试更改它,但由于 Django 在django.db.backends.base.schema._delete_composed_index() 中的验证而出现错误 - 它从数据库中收集所有约束并验证只有一个:

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 函数调用。

那么,你现在应该做什么?

  • 打开您的数据库并手动删除重复的约束。
  • 请勿对约束使用相同的键。

【讨论】:

  • 正如我提到的,我确实尝试过 1) 手动删除此索引 2) 从模型中删除它并 --fake migrate 3) 通过添加“unique_together = (('p_id' , 'v_id', 'sku',)"
  • 当我尝试通过迁移添加“sku2”时产生完全相同的错误
  • 您是否从migrations 文件夹中删除旧迁移?也许它会尝试应用旧的?
  • 好吧,它准确地说明了发生错误时应用的内容......添加了“sku2”,仅此而已
  • 所以我打印了 consraint_names:[u'products_composite_uniq', u'products_pkey'],主键是 Composite_unique 也许问题是 Django 不支持它code.djangoproject.com/wiki/MultipleColumnPrimaryKeys
猜你喜欢
  • 2010-11-03
  • 2012-01-05
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2017-02-06
  • 2016-03-27
相关资源
最近更新 更多