Python 如何创建django迁移以将模型拆分为多个模型

Python 如何创建django迁移以将模型拆分为多个模型,python,django,Python,Django,我有一个django模型,我正在将其拆分为多个模型(django 1.9) 该应用程序或多或少是一个系统,用于跟踪通常与文件关联的项目和项目集。(这些文件不是由用户上传或添加的,这就是我不使用文件字段的原因) 以下是其中一个项目的玩具示例,其中还包含一个关联文件: class ItemTypeA(models.Model): field1 = models.CharField(max_length=512) ... base_dir = models.CharField(

我有一个django模型,我正在将其拆分为多个模型(django 1.9) 该应用程序或多或少是一个系统,用于跟踪通常与文件关联的项目和项目集。(这些文件不是由用户上传或添加的,这就是我不使用文件字段的原因)

以下是其中一个项目的玩具示例,其中还包含一个关联文件:

class ItemTypeA(models.Model):
    field1 = models.CharField(max_length=512)
    ...
    base_dir = models.CharField(max_length=512)
    rel_fname = models.CharField(max_length=512)
在该模型中,我可以在field1上进行筛选,然后获得相应的文件(真实模型有许多字段,与其他模型的关系未列出)。还有更多类型的项目

我想将文件详细信息移动到另一个具有onetoone关系的模型

这可能是这样的:

class Filesystem(models.Model):
    dirpath = models.CharField(max_length=512)
    ... #Some other details for accessing the system, and system availablity.

class BaseFile(models.Model):
    filesystem = models.ForeignKey(Filesystem,related_name="system")
    filepath = models.CharField(max_length=512)
    md5 = models.CharField(max_length=16, editable=False)
    md5_check_datetime = models.DateTimeField()
    size = models.IntegerField(verbose_name="file_size")
    class Meta:
        abstract = True

class ItemTypeAFile(BaseFile):
    pass

class ItemTypeA(models.Model):
    field1 = models.CharField(max_length=512)
    file = models.OneToOneField(ItemTypeAFile)
我想为此创建一个迁移,以便在为每个唯一的
base\u dir==>dirpath
创建文件系统时,使用
OldItemTypeA.rel\u fname==>ItemTypeAFile.filepath
创建一个新的ItemTypeAFile对象


我甚至不知道从何处开始。

您可以使用south创建新模型移植,然后为新类复制/创建新对象,然后从原始模型中删除字段。 我是这样做的:

  • 创建新模型(ItemFile),不要从ItemA中删除字段
  • 使用标准方法生成南部偏移
  • 编辑迁移,并添加一个循环,该循环遍历所有ItemA对象并创建必要的Filesystem和ItemAFile对象
  • 从模型中删除字段,然后创建另一个迁移
  • 下面是(3)的代码可能的样子:

    def forwards_func(apps, schema_editor):
        ItemA = apps.get_model("app", "ItemA")
        Filesystem = apps.get_model("app", "Filesystem")
        ItemAFile = apps.get_model("app", "ItemAFile")
    
        for item in ItemA.objects.all():
            fs,added = Filesystem.objects.get_or_create(dirpath=str(item.base_dir))
            itemafile=ItemAFile(itema=item, filesystem=fs, filepath=item.rel_fname)
            # do md5 stuff
            ....
            itemafile.save()
    
    def reverse_func(apps, schema_editor):
        Filesystem = apps.get_model("app", "Filesystem")
        ItemAFile = apps.get_model("app", "ItemAFile")
    
        Filesystem.objects.all().delete()
        ItemAFile.objects.all().delete()
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ...
        ]
    
        operations = [
            ...
            migrations.RunPython(forwards_func, reverse_func),
        ]
    
    我会考虑把OnToiOne放在ITMAFILE类,而不是ITEMA类:

    class ItemTypeAFile(BaseFile):
        item = models.OneToOneField(ItemTypeA)
    
    这样,如果删除ItemA对象,关联的ItemAFile对象也将被删除。由于ItemAFile是ItemA的扩展,因此这可能是您想要的行为