django模型多态与代理继承

时间:2011-09-23 08:13:17

标签: python django django-models proxy-classes

我的Discount模型描述了系统中所有类型折扣的常用字段。我有一些代理模型描述了用于计算总数的具体算法。 Base Discount类有一个名为type的成员字段,它是一个标识其类型及其相关类的字符串。

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

但我继续得到AttributeError的例外,说自己没有类型。如何解决这个问题还是有另一种方法来实现这一目标?

2 个答案:

答案 0 :(得分:11)

你的init方法需要看起来像这样:

def __init__(self, *args, **kwargs):
    super(Discount, self).__init__(*args, **kwargs)
    if self.type:
        self.__class__ = getattr(sys.modules[__name__], self.type + 'Discount')

您需要先拨打超级__init__,然后才能访问self.type

因调用你的字段type而感到愚蠢,因为type也是一个python内置函数,尽管你可能不会遇到任何问题。

请参阅:http://docs.python.org/library/functions.html#type

答案 1 :(得分:0)

在引用super(Discount, self).__init__(*args, **kwargs)之前致电self.type