Python 如何创建django迁移以将模型拆分为多个模型
我有一个django模型,我正在将其拆分为多个模型(django 1.9) 该应用程序或多或少是一个系统,用于跟踪通常与文件关联的项目和项目集。(这些文件不是由用户上传或添加的,这就是我不使用文件字段的原因) 以下是其中一个项目的玩具示例,其中还包含一个关联文件:Python 如何创建django迁移以将模型拆分为多个模型,python,django,Python,Django,我有一个django模型,我正在将其拆分为多个模型(django 1.9) 该应用程序或多或少是一个系统,用于跟踪通常与文件关联的项目和项目集。(这些文件不是由用户上传或添加的,这就是我不使用文件字段的原因) 以下是其中一个项目的玩具示例,其中还包含一个关联文件: class ItemTypeA(models.Model): field1 = models.CharField(max_length=512) ... base_dir = models.CharField(
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创建新模型移植,然后为新类复制/创建新对象,然后从原始模型中删除字段。 我是这样做的:
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的扩展,因此这可能是您想要的行为