我从同事那里继承了多个相同的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是主键)必须是唯一的。
答案 0 :(得分:0)
晚了 3 年,但我希望它会帮助某人。当您删除所有模型字段中的primary_key attr 时,Django 将尝试创建一个名为id 的AutoField 字段,它将作为您模型的primary_key,但是当您的数据库中已有数据时,您必须为现有条目设置默认值,这将导致另一个问题,因为 primary_key 是唯一。 但解决方案可以是在 SQL 表中手动创建一个名为 id 的 primary_key 字段。
ALTER TABLE tablename DROP PRIMARY KEY;
ALTER TABLE tablename ADD id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
如果您希望 Django 将此字段作为默认主键,则必须将其名称设置为 id。
删除相应应用中的所有迁移文件并重新运行 python manage.py makemigrations
。您的代码必须类似于:
class MyModel(models.Model):
sessionid = models.ForeignKey('Session', models.DO_NOTHING, db_column='sessionID')
datetime = models.BigIntegerField()
...