Django Abstract Class меняет поведение в соответствии с реальным классом

Я думаю, что следующий код объясняет, что я пытаюсь сделать

from django.db import models


class MyBaseClass(models.Model):
    type = models.IntegerField()

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        self.type = #What Should I write here?#
        self.type = self.class.type ?
        super().save(*args, **kwargs)


class Model1(MyBaseClass):
    TYPE = 1


class Model2(MyBaseClass):
    TYPE = 2

Я хочу убедиться, что следующие утверждения работают:

instance1 = Model1.objects.create()
assert(instance1.type, 1)
instance2 = Model2.objects.create()
assert(instance1.type, 2)

Как я могу сделать эту работу? Благодарю.

1 ответ

Решение

Установка значения по умолчанию унаследованных моделей

Если вы хотите установить значения по умолчанию для унаследованных моделей, вы можете сделать это. Подобно:

class Model1(MyBaseClass):
    TYPE = 1


class Model2(MyBaseClass):
    TYPE = 2

Model1._meta.get_field('type').default = Model1.TYPE
Model2._meta.get_field('type').default = Model2.TYPE

Добавление статического атрибута в модели

В случае, если .type из всех Model1 объекты всегда 1, и для Model2 объекты это всегда 2то нет никаких причин хранить эти типы в базе данных. Эти модели хранятся в разных таблицах, поэтому тот факт, что запись происходит из app_model1 таблица "подразумевает" это. В этом случае вы можете установить атрибут класса, например:

class MyBaseClass(models.Model):
    type = None

    class Meta:
        abstract = True


class Model1(MyBaseClass):
    type = 1


class Model2(MyBaseClass):
    type = 2
Другие вопросы по тегам