首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Django中将unique_together约束从一组模型字段更改为另一组

如何在Django中将unique_together约束从一组模型字段更改为另一组
EN

Stack Overflow用户
提问于 2020-03-19 12:54:00
回答 1查看 92关注 0票数 0

在我的Django项目中,我有以下模型

代码语言:javascript
运行
复制
class TenderOrigin(models.Model):
    doc_type = models.CharField(max_length=2, ...)
    doc_short_txt = models.CharField(max_length=150, ...)
    create_date = models.DateField(default=timezone.now, ...)
    port_grp = models.ForeignKey(PortGroup, on_delete=models.CASCADE, null=True, ...)
#    frt_grp = models.ForeignKey(FrtGroup, on_delete=models.CASCADE, null=True, ...)
    locn_from = models.ForeignKey(Plant, on_delete=models.CASCADE, ...)
    tender_number = models.CharField(max_length=150, null=True,...)
    tender_date = models.DateField(null=True, ...)

    class Meta:
        ordering = ['locn_from__LocName']
#        unique_together = [['frt_grp', 'locn_from', 'tender_date'],]    # Original constraint
        unique_together = [['port_grp', 'locn_from', 'tender_date'],]    # New constraint being defined

如前所述(针对唯一约束的defn)。上面,我试图将原始的unique_together约束更改为新的约束(使用字段port_grp)。更改是必须的,因为一个新字段(port_grp)正在添加到模型中,而字段frt_grp正在被删除。

但是,在迁移过程中,我会收到以下错误消息:

代码语言:javascript
运行
复制
...
...    
Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
...
...
 File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 303, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: UNIQUE constraint failed: matmovt_tenderorigin.port_grp_id, matmovt_tenderorigin.locn_from_id, matmovt_tenderorigin.tender_date

是否可以将为一组unique_together字段()定义的约束更改为另一组(而不删除现有数据)?

EN

回答 1

Stack Overflow用户

发布于 2020-03-19 18:11:56

我就是这样接近它的。

constraint.

  • Generate
  1. 根据需要在您的模型上创建新字段。
  2. 为新字段创建迁移。
  3. 创建数据迁移以填充新字段
  4. 创建UniqueConstraint并删除旧的唯一old约束更改迁移。确保下拉列表是在创建之后。虽然所有这些都应该在一个事务中运行,所以这并不重要。
  5. 删除了旧字段。

如果您的数据迁移将创建违反旧的唯一约束的数据,那么在进行数据迁移之前将其删除。显然,这是非常危险的,因为现在您允许系统本身生成可能无效的数据,这使得回滚/反向迁移非常痛苦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60757682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档