查询超类,并为Django模型的每个子类提供不同的逻辑

时间:2016-05-12 12:32:58

标签: django oop django-models

我根据this question关于Django超类和子类的后续行动提出要求。

鉴于我有食物项目

Properties

现在,在我的class Food_Item(models.Model): name = models.CharField(max_length=100) cost = models.IntegerField(null=False, blank=False, default=0) class TunaSub(Food_Item): fish_ingredient = models.CharField(max_length=10, default="Tuna") def __str__(self): return self.name class MeatballSub(Food_Item): meat_ingredient = models.CharField(max_length=20 , default="Meatball with Cheese") def __str__(self): return self.name 中说我希望获得所有的食物项目,并且基于子类,我想要一个不同的逻辑。例如:

views.py

有没有正确的方法呢?

2 个答案:

答案 0 :(得分:2)

根据逻辑的工作原理,有几种可能性:

如果折扣是食品本身的属性(与其他更复杂的逻辑相反),您可以将逻辑移动到模型中:

class TunaSub(Food_Item):
    #...
    @property
    def cost_with_discount(self):
        return self.cost * 0.8  # You might even want to store this as a DB field...

然后在视图中:

total = total + item.cost_width_discount

如果逻辑更复杂并且取决于其他时间因素,那么您已采取的方法将起作用:

if item.__class__.__name__ == 'TunaSub':
    total = total + (item.cost*0.8) #there is a 20% discount

答案 1 :(得分:1)

这样做的一种方法是:

for item in all_food_items:
    if hasattr(item, "tunasub"):
        total = total + (item.cost * 0.8)
    elif hasattr(item, "meatballsub"):
        total = total + (item.cost * 0.75)
    ...