TypeError: Абстрактные модели не могут быть инстанцированы (Django)

У меня есть абстрактные модели A и B и дочерняя модель C.

class A(models.Model):
    field1 = models.CharField(max_length=24)

    class Meta:
        abstract = True


class B(models.Model):
    field1 = models.CharField(max_length=24)

    class Meta:
        abstract = True

   def make_A(self):
      A(field1=self.field1).save()


class C(B):
    pass

Если я пытаюсь запустить C.make_A(), то получаю ошибку TypeError: Abstract models cannot be instantiated. Поэтому я вынужден переписать метод make_A на дочернем объекте. Есть ли способ написать метод, который инстанцирует A под абстрактным B?

Проблема не в том, что B абстрактен, проблема в том, что A абстрактен. Но вы можете сделать "шаблонный метод", который затем слегка измените в C с помощью:

class B(models.Model):
    concrete_A = None
    field1 = models.CharField(max_length=24)

    class Meta:
        abstract = True

    def make_A(self):
        self.concrete_A.objects.create(field1=self.field1)


class C(B):
    concrete_A = SubA

С SubA конкретным подклассом A.

При этом, учитывая, что я понимаю, что вы хотите сделать, кажется, что вы просто в какой-то степени повторяете то, что делает django-simple-history [readthedocs.io].

Вернуться на верх