具有代理继承的django模型多态 [英] django model polymorphism with proxy inheritance
问题描述
我的折扣
模型描述了系统中所有类型折扣的常见字段。我有一些代理模型描述了总体累积的具体算法。基础折扣
类有一个成员字段名为 type
,它是一个字符串,用于标识其类型及其相关类。
class Discount(models.Model):
TYPE_CHOICES =(
('V' '),
('P','Percentage'),
)
name = models.CharField(max_length = 32)
code = models.CharField max_length = 32)
quantity = models.PositiveIntegerField()
value = models.DecimalField(max_digits = 4,decimal_places = 2)
type = models.CharField(max_length = 1,choices = TYPE_CHOICES )
def __unicode __(self):
return self.name
def __init __(self,* args,** kwargs):
如果自己.type:
self .__ class__ = getattr(sys.modules [__ name__],self.type +'Discount')
super(Discount,self).__ init __(* args,** kwargs)
class ValueDiscount(Discount):
class Meta:
proxy = True
def total(self,total):
return total - self但是我不断收到AttributeError的异常,说self没有类型。如何解决这个问题,还是有另一种方法来实现?解决方案你的init方法需要看起来像这样: p>
def __init __(self,* args,** kwargs):
super(Discount,self).__ init __(* args ,** kwargs)
如果self.type:
self .__ class__ = getattr(sys.modules [__ name__],self.type +'Discount')
您需要调用super的 __ init __
才能访问
。
自以来,呼吁您的字段类型
c> type
也是一个python内置函数,虽然你可能不会遇到任何问题。
请参阅: http://docs.python.org/library/functions.html#type
My Discount
model describes common fields for all types of discounts in the system. I have some proxy models which describe concrete algorithm for culculating total. Base Discount
class has a member field named type
, which is a string identifing its type and its related class.
class Discount(models.Model):
TYPE_CHOICES = (
('V', 'Value'),
('P', 'Percentage'),
)
name = models.CharField(max_length=32)
code = models.CharField(max_length=32)
quantity = models.PositiveIntegerField()
value = models.DecimalField(max_digits=4, decimal_places=2)
type = models.CharField(max_length=1, choices=TYPE_CHOICES)
def __unicode__(self):
return self.name
def __init__(self, *args, **kwargs):
if self.type:
self.__class__ = getattr(sys.modules[__name__], self.type + 'Discount')
super(Discount, self).__init__(*args, **kwargs)
class ValueDiscount(Discount):
class Meta:
proxy = True
def total(self, total):
return total - self.value
But I keep getting exception of AttributeError saying self doesnt have type. How to fix this or is there another way to achieve this?
解决方案 Your init method needs to look like this instead:
def __init__(self, *args, **kwargs):
super(Discount, self).__init__(*args, **kwargs)
if self.type:
self.__class__ = getattr(sys.modules[__name__], self.type + 'Discount')
You need to call super's __init__
before you will be able to access self.type
.
Becareful with calling your field type
since type
is also a python built-in function, though you might not run into any problems.
See: http://docs.python.org/library/functions.html#type
这篇关于具有代理继承的django模型多态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!