多对多中间表的Django遗留数据库迁移
遗留数据库迁移到Django(v1.11)(来自Sequelize) 数据库中的中间表没有id(主键属性),因为Sequelize不需要它,但在Django中它似乎是必需的 当前Django设置:多对多中间表的Django遗留数据库迁移,django,sequelize.js,database-migration,Django,Sequelize.js,Database Migration,遗留数据库迁移到Django(v1.11)(来自Sequelize) 数据库中的中间表没有id(主键属性),因为Sequelize不需要它,但在Django中它似乎是必需的 当前Django设置: class Address(models.Model): keyword = models.CharField(max_length=255) city = models.CharField(max_length=255, blank=True, null=True) stat
class Address(models.Model):
keyword = models.CharField(max_length=255)
city = models.CharField(max_length=255, blank=True, null=True)
state = models.CharField(max_length=255, blank=True, null=True)
createdAt = models.DateTimeField(db_column='createdAt', auto_now_add=True)
updatedAt = models.DateTimeField(db_column='updatedAt', auto_now=True)
class Meta:
db_table = 'Addresses'
class CustomerExecutive(models.Model):
name = models.CharField(max_length=255, blank=True, null=True)
email = models.CharField(max_length=255)
addresses = models.ManyToManyField('Address', through='AddressCustomerExecutiveMapping')
createdAt = models.DateTimeField(db_column='createdAt', auto_now_add=True)
updatedAt = models.DateTimeField(db_column='updatedAt', auto_now=True)
class Meta:
db_table = 'CustomerExecutives'
class AddressCustomerExecutiveMapping(models.Model):
address = models.ForeignKey(Address, db_column='addressId', primary_key=True)
customer_executive = models.ForeignKey(CustomerExecutive, db_column='customerExecutiveId', primary_key=True)
createdAt = models.DateTimeField(db_column='createdAt', auto_now_add=True)
updatedAt = models.DateTimeField(db_column='updatedAt', auto_now=True)
class Meta:
db_table = 'AddressCustomerExecutiveMapping'
unique_together = (('address', 'customer_executive'),)
如果未在AddressCustomerExecutiveMapping.address
或AddressCustomerExecutiveMapping.customer\u ExecutiveMapping.customer\u
上指定primary\u key
,则会给出所需的主键错误,如果指定,则无法在列中添加重复值(然后不是多对多)
如何解决此问题?从两个字段中删除主键。如前所述,它会给出一个主键必需的错误。我运行,它对我有效,在删除主键属性后,尝试重新划分数据库,迁移工作正常,但由于表中已存在数据,因此无法在其上创建id属性。在请求默认值(如果给定909)后失败,随后表示主键不能重复,因为您已写下脚本,该脚本将更改该值。在迁移文件中生成一个函数,该函数生成唯一的no,并在默认情况下传递该函数,这些代码将进入侧迁移