使用迁移创建新的AutoField

时间:2017-11-28 14:03:03

标签: python django

我从同事那里继承了多个相同的MySQL数据库。使用DJANGO的inspectdb我为它导出了数据模型,并创建了一个Web界面来查看数据。再次实例化模型结构时,DJANGO无法为2个字段创建unique_together约束。

问题: 我想摆脱现有的unique_together和2个主键,因为DJANGO不支持多个主键。例如,使用DJANGO自动生成的id字段(作为主键)。这可能吗,我应该怎么做?编写自定义迁移是一种选择,但如何?

约束上 数据丢失不是一种选择,因此我不能只删除表。 此外,还应保留迁移历史记录。

我所拥有的是

class MyModel(models.Model):
  sessionid = models.ForeignKey('Session', models.DO_NOTHING, db_column='sessionID', primary_key=True) 
  datetime = models.BigIntegerField(primary_key=True)

  class Meta:       
      unique_together = (('sessionid', 'datetime'),)

但它应该变成

class MyModel(models.Model):
  sessionid = models.ForeignKey('Session', models.DO_NOTHING, db_column='sessionID') 
  datetime = models.BigIntegerField()

非常感谢任何帮助!

编辑1

删除prmimary键时,DJANGO会尝试创建所需的id autofield。但是,由于表中存在数据,DJANGO需要默认的初始值。虽然不允许使用默认值,但主键(autofields是主键)必须是唯一的。

1 个答案:

答案 0 :(得分:0)

晚了 3 年,但我希望它会帮助某人。当您删除所有模型字段中的primary_key attr 时,Django 将尝试创建一个名为id 的AutoField 字段,它将作为您模型的primary_key,但是当您的数据库中已有数据时,您必须为现有条目设置默认值,这将导致另一个问题,因为 primary_key 是唯一。 但解决方案可以是在 SQL 表中手动创建一个名为 idprimary_key 字段。

  1. 删除当前主键

ALTER TABLE tablename DROP PRIMARY KEY;

  1. 创建一个新的主键字段

ALTER TABLE tablename ADD id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

如果您希望 Django 将此字段作为默认主键,则必须将其名称设置为 id

  1. 在您的 Django 应用上进行迁移。

删除相应应用中的所有迁移文件并重新运行 python manage.py makemigrations。您的代码必须类似于:

class MyModel(models.Model):
  sessionid = models.ForeignKey('Session', models.DO_NOTHING, db_column='sessionID') 
  datetime = models.BigIntegerField()

  ...