Django抽象类根据实际类更改行为

时间:2019-01-26 15:14:24

标签: django django-models django-model-field

我认为以下代码说明了我要做什么

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 个答案:

答案 0 :(得分: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
相关问题