我根据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
有没有正确的方法呢?
答案 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)
...