Python では、次のようにオブジェクトのクラスを変更できます。
b.__class__=C
次に、クラス C に定義されていない場合でも、B のすべての属性を使用できます。b は現在クラス C のインスタンスですが、C の属性はありません。オブジェクトをデータベースに保存する (または Model クラスの他のメソッドを呼び出す) 前に、クラス C の残りのすべての属性を追加する必要があります。それが機能することを証明するために、単純なアプリを作成しました。ここに私のモデルがあります:
class A(models.Model):
attrA = models.CharField(max_length=128)
class Meta:
abstract=True
class B(A):
attrB = models.CharField(max_length=128)
class C(A):
attrC = models.CharField(max_length=128)
そして、ここに私のテストがあります:
class ABCTestCase(TestCase):
def test_changing_classes(self):
"""Changing classes"""
a = A()
self.assertIsInstance(a, A)
a.attrA='bacon'
self.assertEqual(a.attrA, 'bacon')
a.__class__=B
self.assertIsInstance(a, B)
self.assertEqual(a.attrA, 'bacon')
a.attrB='spam'
self.assertEqual(a.attrA, 'bacon')
self.assertEqual(a.attrB, 'spam')
a.__class__=C
self.assertIsInstance(a, C)
self.assertIsInstance(a, A)
self.assertNotIsInstance(a, B)
a.attrC='egg'
self.assertEqual(a.attrA, 'bacon')
self.assertEqual(a.attrB, 'spam')
self.assertEqual(a.attrC, 'egg')
a.id=None
a.save()
self.assertIsNotNone(a.id)
テストの結果はOKです。
より安全な方法は、B から C へ、または C から B へ変換するクラスごとにメソッドを定義することです。