Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django中从一组模型字段到另一组模型字段对unique_together约束进行更改_Django_Sqlite_Django Models_Unique Constraint - Fatal编程技术网

如何在Django中从一组模型字段到另一组模型字段对unique_together约束进行更改

如何在Django中从一组模型字段到另一组模型字段对unique_together约束进行更改,django,sqlite,django-models,unique-constraint,Django,Sqlite,Django Models,Unique Constraint,在Django项目中,我有以下模型: 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.Fore

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

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
如上所述(针对唯一约束的定义),我正在尝试将原始的唯一约束一起更改为新的约束(使用field
port\u grp
)。当字段
frt\u grp
被删除时,添加到模型中的新字段(
port\u grp
)需要进行更改

但是,迁移时,我收到以下错误消息:

...
...    
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
。。。
...    
回溯(最近一次呼叫最后一次):
文件“manage.py”,第15行,在
从命令行(sys.argv)执行命令
...
...
文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/django/db/backends/sqlite3/base.py”,执行中的第303行
返回Database.Cursor.execute(self、query、params)
django.db.utils.IntegrityError:唯一约束失败:matmovt_tenderorigin.port_grp_id,matmovt_tenderorigin.locn_from_id,matmovt_tenderorigin.tender_日期

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

以下是我的方法

  • 根据需要在模型上创建新字段
  • 为新字段创建迁移
  • 创建数据迁移以填充新字段
  • 创建唯一约束并删除旧的唯一约束
  • 为约束更改生成迁移。确保放置在创建之后。虽然它应该在一个事务中运行,所以这不重要
  • 扔掉旧田地
  • 如果您的数据迁移将创建违反旧的唯一约束的数据,请在执行数据迁移之前删除该约束。显然,这是非常危险的,因为现在您允许系统本身生成可能无效的数据,这使得回滚/反向迁移非常痛苦