полиморфизм модели Джанго с наследованием по доверенности - PullRequest
7 голосов
/ 23 сентября 2011

Моя Discount модель описывает общие поля для всех типов скидок в системе.У меня есть несколько прокси-моделей, которые описывают конкретный алгоритм подсчета итогов.Базовый класс 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, говоря, что self не имеет типа.Как это исправить или есть другой способ добиться этого?

Ответы [ 2 ]

12 голосов
/ 23 сентября 2011

Ваш метод инициализации должен выглядеть следующим образом:

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

Вам нужно вызвать super's __init__, прежде чем вы сможете получить доступ к self.type.

Будьте осторожны с вызовомваше поле type, поскольку type также является встроенной функцией Python, хотя вы можете не столкнуться с какими-либо проблемами.

См .: http://docs.python.org/library/functions.html#type

0 голосов
/ 23 сентября 2011

вызов super(Discount, self).__init__(*args, **kwargs) перед ссылкой self.type.

...