【问题标题】:Add Django model parent class to existing an existing model for multi-table inheritance将 Django 模型父类添加到现有模型中以实现多表继承
【发布时间】:2016-08-29 00:29:51
【问题描述】:

Django Docs 使用这个例子来演示多表继承:

from django.db import models

class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

class Restaurant(Place):
    serves_hot_dogs = models.BooleanField(default=False)
    serves_pizza = models.BooleanField(default=False)

如果我最初是这样构建 Restaurant 类的:

class Restaurant(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)
    serves_hot_dogs = models.BooleanField(default=False)
    serves_pizza = models.BooleanField(default=False)

然后在已经创建了一堆 Restaurant 对象之后,我意识到使用 MTI 会更好,有没有一种好方法可以在事后创建父 Place 类并迁移数据?

【问题讨论】:

  • 你的意思是在代码可读性或性能方面更好?也许你应该看看这篇文章:stackoverflow.com/questions/23466577/…
  • 我不太确定你的问题,如果你想拥有父模型对象并且不想为它创建表,你可以使用。 'class Meta: Abstract = True'
  • 我的意思是我想转换我当前的结构以使用多表继承。例如,我现在想添加一个Office 模型,它也有名称和地址,我希望所有地址都是唯一的;所以我想添加 Place 和 Office 类并迁移我现有的 Restaurant 数据以使用新的数据结构。
  • @Amar: abstract 必须全部小写。

标签: django models multi-table-inheritance


【解决方案1】:

简单的方法:在子模型中创建名为<parent_model>_ptr的假IntegerField,填充它,然后将其删除并同时添加父模型。

这是一篇完整的文章:http://www.johnborwick.com/blog/2013/08/using-south-to-change-a-django-models-parent-class/。它是关于南方的,但这个想法也适用于现代 Django。

【讨论】:

  • 感谢您分享此内容。下次遇到此问题时,我一定会尝试此操作
  • 救命稻草!非常感谢!
【解决方案2】:
  1. 添加新模型,同时保留旧模型。 进行迁移

  2. 编写自定义迁移,将数据从Restaurant 模型复制到NewRestaurant 模型。

  3. 如有必要,将其他模型中的任何外键字段从 Restaurant 更改为 NewRestaurant进行迁移

  4. 如有必要,将应用程序中使用Restaurant 类的所有位置更改为使用NewRestaurant 类。

  5. 删除旧的餐厅模型并进行迁移

  6. 将新餐厅模型重命名为 Restaurant,这样一切都可以在新结构中重新运行。 进行迁移

【讨论】:

  • 我有一个问题 - 如果 NewRestaurant 稍后将被重命名,您如何保持从 p.2 迁移的 NewRestaurant 的导入?
  • @GriMel 您不会从迁移中直接导入您的应用程序代码,由于您指出的原因,这是不可维护的,而是使用MyModel = apps.get_model('app','MyModel')。 Django 将能够在其历史上下文中运行您的代码,请参阅docs.djangoproject.com/fr/3.2/ref/migration-operations/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多