3

如果我有一个多态模型:

class Father(polymorphic.model.PolymorphicModel)

和一个没有额外字段的继承者类:

class Child(Father)

当我有一个父亲实例时,如何将其转换为子实例?

我尝试过的是:

foo = Father.objects.get(pk=1)
# foo is just a Father, no record in Child database table.
foo.polymorphic_ctype = ContentType.objects.get(app_label='myapp', model='child')
foo.save()

但没有任何改变。我希望foo成为 Child 对象,并且需要将其放入子数据库表中。

4

3 回答 3

2

好的。

在阅读了这篇类似的帖子后,我意识到我需要另一个任务:

foo.__class__ = Child

这会在子表中插入,否则永远不会发生。

于 2016-09-14T15:29:13.730 回答
0

对于多态模型,您可以这样做:

kclass = YourChangeClass
# With that do the correct insert
self.__class__ = kclass
# With that change the correct model
ct = ContentType.objects.get_for_model(kclass)
self.polymorphic_ctype = ct
# With that set the default values
self.set_default_values()
self.save()

你需要为每个类定义一个定义默认值的方法,因为当 save() 失败时!

例如,如果您需要从 A 传递到 B:

class A():
    attr_1
class B()
    attr_2
    def set_default_values(self):
        self.attr_2 = None
于 2019-11-08T17:55:16.883 回答
0

Django 会自动将条目复制到父项中的子项中。对于创建 Child 类的迁移,您可以简单地将新的 Child 对象保存在 DB 中(使用 python 对象的__dict__属性填充它们):

在您的迁移文件中定义此函数:

def duplicate_Children(apps,schema_editor):
    Father = apps.get_model('myapp','Father')
    Child= apps.get_model('myapp','Child')
    for dad in Father.objects.all():
         son = Child()

         for attr in dad.__dict__:
             son.__dict__[attr]=dad.__dict__[attr]

         son.save()

...

将此添加到 Migrate 类中的操作列表中:

operations = [migrations.RunPython(duplicate_Children)]
于 2019-08-08T07:04:47.340 回答