gpt4 book ai didi

python - 如何创建用于将模型拆分为多个模型的 Django 迁移

转载 作者:太空狗 更新时间:2023-10-30 02:41:55 25 4
gpt4 key购买 nike

我有一个 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 进行过滤,然后获取相应的文件(真实模型有很多字段,与其他模型的关系未列出)。还有更多类型的项目。

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

这可能看起来像这样:

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_dir==>dirpath 创建文件系统,并使用 OldItemTypeA.rel_fname== 创建一个新的 ItemTypeAFile 对象>ItemTypeAFile.filepath.

我什至不知道从哪里开始。

最佳答案

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

  1. 创建新模型(ItemFile),不要从 ItemA 中删除字段
  2. 使用标准方法生成南迁移
  3. 编辑迁移,并添加一个遍历所有 ItemA 对象并创建必要的 Filesystem 和 ItemAFile 对象的循环。
  4. 从模型中删除字段,创建另一个迁移。

下面是 (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),
]

我会考虑将 onetoone 放在 ItemAFile 类而不是 ItemA 类上:

class ItemTypeAFile(BaseFile):
item = models.OneToOneField(ItemTypeA)

这样,如果您删除一个 ItemA 对象,关联的 ItemAFile 对象也将被删除。由于 ItemAFile 是 ItemA 的扩展,这可能是您想要的行为。

关于python - 如何创建用于将模型拆分为多个模型的 Django 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37978823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com