Django数据迁移,使用South与继承
我们正在将Django项目中的多个实例的数据迁移到一个新的结构。
旧的结构是:
class Group(models.Model)
class User(models.Model)
新的结构是:
class AccessEntity(models.Model)
class Group(AccessEntity)
class User(AccessEntity)
我们正在尝试使用South来进行这些用户和组的数据迁移。http://south.aeracode.org/docs/tutorial/part3.html
我了解到,我需要使用向前规则来指定如何迁移用户,但我遇到了一些问题。
主要的问题是,如果我创建一个新的用户对象,并且这个对象要扩展AccessEntity类,如何保持用户/组的ID不变。
用户和组是通过它们拥有的对象或被分配给它们的对象来引用的。如果我改变它们的ID,那些信息就会丢失。有没有办法在需要让对象扩展AccessEntity的情况下,保持对象的ID不变呢?
1 个回答
我不太确定我是否理解你的问题,但多表模型继承的工作方式是,父模型和子模型之间会有一个隐含的一对一字段。所以,如果 AccessEntity 有一个 ID 字段,那么 User 和 Group 都会使用这个 ID 字段。
如果你创建 AccessEntity,并且给它一个 ID
字段,你可以在进行数据迁移时为它分配一个值。这样可以确保 AccessEntity 拥有正确的 ID。
我写过一个比较长的 多表继承的教程,看起来你想做的事情和这个类似。
另外,回答 这个问题 的内容也可能对你有帮助(注意,原答案中的某些内容在新版本的 Django / South 中可能不再适用,具体变化可以参考我的教程或底部的答案)。
在你的情况下,可能会遇到一个问题,就是如果 User 和 Group 中已经有数据,并且 ID 字段是自动生成的,那么 IDs
可能会重复,比如你可能会有一个 User 和一个 Group 的 ID==1
。如果你想根据这些 IDs
查询数据,这可能会造成问题,当然这时 ID
也不能作为 AccessEntity
的主键。