当前位置: 首页 > 面试题库 >

具有代理继承的Django模型多态性

白成济
2023-03-14
问题内容

我的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没有类型。如何解决此问题,或者还有其他方法可以解决此问题?


问题答案:

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

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

您需要先致电super的,__init__然后才能访问self.type

请谨慎调用字段,type因为type它也是python内置函数,尽管您可能不会遇到任何问题。

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



 类似资料:
  • 问题内容: 我在想,如果以下迁移是可能的Django的南部和仍然保留的数据。 之前: 我目前有两个应用程序,一个叫做电视,一个叫做电影,每个都有一个VideoFile模型(在这里简化): tv/models.py: movies/models.py: 后: 因为这两个videofile对象是如此相似,所以我想摆脱重复并在一个名为media的单独应用中创建一个新模型,其中包含通用的VideoFile

  • 你更喜欢/建议哪一个?

  • 问题内容: 除了语法外,使用django抽象模型和对django模型使用纯Python继承之间有什么区别?利弊? 更新:我认为我的问题被误解了,并且我收到了关于抽象模型与从django.db.models.Model继承的类之间的区别的答复。 我实际上想知道从Django抽象类(元:abstract = True)继承的模型类与从诸如“ object”(而不是models.Model)继承的普通P

  • 问题内容: 假设我有两个班级:动物和狗。狗是动物的子类。我执行以下代码: 现在,我可以通过a变量来调用Dog类的方法。 但是我的问题是:如果我可以通过Dog对象(继承性)调用Animal的所有方法,那么为什么要使用多态原理呢?我可以声明: 通过此声明,可以使用所有Animal方法和Dog方法。那么为什么要使用多态呢?非常感谢您的回答。 问题答案: 在Java中,多态和继承的概念被“焊接在一起”。通

  • 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。 比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self):

  • 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。 比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self):

  • 有没有可能编写一个Avro schema/IDL来生成一个Java类,或者扩展一个基类,或者实现一个接口?似乎生成的Java类扩展了< code > org . Apache . avro . specific . specificrecordbase 。所以,工具可能是正确的选择。但是,我不知道这是否可能。 我看过一些示例,其中包含在每个特定架构中定义显式“类型”字段的建议,其关联性大于继承语义

  • X:我有一个不相关的类似容器的对象(向量、映射、树、...)的集合,处理不同不相关类型的对象。这些容器中对象的生命周期在它们的某些子集之间共享。我有一个负责它们同步的对象。我能想到的同步类的最简单实现是有一个指针的向量,其中将是一个为我要管理的所有类似容器的对象实现公共接口的类。但并不是所有的都像容器一样。它们可以用作容器,但是让它们继承一个通用的基类感觉很奇怪,我害怕它会非常强烈地耦合我的设计。