2011-02-17 100 views
0

我们正在将Django项目的多个实例中的数据迁移到新模式。Django数据迁移,使用南继承

旧模式有:

class Group(models.Model) 
class User(models.Model) 

而新的模式有:

class AccessEntity(models.Model) 
class Group(AccessEntity) 
class User(AccessEntity) 

我们正试图利用南方做这些组和用户数据迁移。 http://south.aeracode.org/docs/tutorial/part3.html

我已经收集到我需要使用转发规则来指定如何迁移用户,但是我遇到了一些问题。

主要问题是如果我要创建一个扩展AccessEntity类的新User对象,如何保持用户/组的ID相同。

用户&组通过它们拥有或分配给它们的对象引用。如果我改变他们的ID,那么信息将会丢失。即使我现在需要它从AccessEntity扩展,是否有一种方法可以为对象保留相同的ID?

回答

2

不知道我是否正确理解您的问题,但多表模型继承的工作方式是在父模型和子模型中会存在隐式的一对一字段。因此,如果AccessEntity具有这样的字段,则用户和组将使用AccessEntity的ID字段。

如果您创建AccessEntity,使其具有ID字段,则可以在编写转发(数据)迁移时分配给它。这样你可以确保AccessEntity获得正确的ID。

如果已经写了更长的multi-table inheritance tutorial,它看起来像你正在尝试做类似的事情。

此外,对this question的回答也可能有帮助(请注意,原始答案中的某些内容在django/south的新版本中无效,请参阅我的教程/底部的答案以进行更改)。

您的情况可能是什么问题,如果您已经在用户和组中都有数据,并且id字段是自动生成的,则IDs可能不是明显的,例如,您很可能会同时拥有一个用户和一个群组ID==1。如果要根据那些IDs进行查询,并且当然ID不能成为AccessEntity的主键,则这可能是个问题。