具有代理继承的django模型多态 [英] django model polymorphism with proxy inheritance

查看:181
本文介绍了具有代理继承的django模型多态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的折扣模型描述了系统中所有类型折扣的常见字段。我有一些代理模型描述了总体累积的具体算法。基础折扣类有一个成员字段名为 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆