【问题标题】:Django Abstract Class change behaviour according to actual classDjango Abstract Class 根据实际类改变行为
【发布时间】:2019-01-26 15:14:23
【问题描述】:

我认为以下代码解释了我正在尝试做的事情

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)

我怎样才能做到这一点?谢谢。

【问题讨论】:

  • 这里TYPE有什么用?这只是一个静态方面,还是您想设置一个 default 值。如果是前者,你应该永远不要定义一个type列,因为这两个模型的记录存储在不同的表中,所以它一点用都没有。

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


【解决方案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

为模型添加静态属性

如果所有Model1 对象中的.type 总是 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

【讨论】:

  • 非常有见地的评论和回答,我实际上想在type 的基础上做一些额外的逻辑,但是在睡了之后我意识到我可以把额外的逻辑放在一个函数和两者中。 save() 方法我可以用不同的参数调用它。你的回答还是很有用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 2021-08-08
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多