Django Abstract Class 根据实际改变行为 class

Django Abstract Class change behaviour according to actual 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)

我怎样才能完成这项工作?谢谢

设置继承模型的默认

如果你想设置继承模型的默认值,你可以猴子修补这些。喜欢:

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

向模型添加静态属性

如果所有 Model1 个对象的 .type 总是 1,而 Model2 个对象总是 2,那么根本就没有理由把这些类型存在数据库中。这些模型存储在不同的 table 中,因此记录源自 app_model1 table "implies" 的事实。在这种情况下,您可以设置一个 class 属性,例如:

class MyBaseClass(models.Model):
    type = <b>None</b>

    class Meta:
        abstract = True


class Model1(MyBaseClass):
    <b>type = 1</b>


class Model2(MyBaseClass):
    <b>type = 2</b>