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>
我认为以下代码解释了我正在尝试做的事情
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>