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