我将现有模型分类。我希望现在有许多父类的成员成为子类的成员。

例如,我有一个Swallow模型。现在,我正在制作EuropeanSwallow(Swallow)和AfricanSwallow(Swallow)。我想带一些但不是全部的Swallow对象使它们成为EuropeanSwallow或AfricanSwallow,具体取决于它们是否迁移。

我该如何移动它们?

最佳答案

我知道这要晚得多了,但是我需要做类似的事情并且找不到很多东西。我发现答案隐藏在某些源代码here中,但是还编写了一个示例类方法就足够了。

class AfricanSwallow(Swallow):

    @classmethod
    def save_child_from_parent(cls, swallow, new_attrs):
        """
        Inputs:
        - swallow: instance of Swallow we want to create into AfricanSwallow
        - new_attrs: dictionary of new attributes for AfricanSwallow

        Adapted from:
        https://github.com/lsaffre/lino/blob/master/lino/utils/mti.py
        """
        parent_link_field = AfricanSwallow._meta.parents.get(swallow.__class__, None)
        new_attrs[parent_link_field.name] = swallow
        for field in swallow._meta.fields:
            new_attrs[field.name] = getattr(swallow, field.name)
        s = AfricanSwallow(**new_attrs)
        s.save()
        return s

但是,我不知道如何使表单验证与该方法一起使用。因此肯定可以进一步改进;可能意味着数据库重构可能是最好的长期解决方案...

10-07 14:56