在模板中显示“我的报价”项目的总价

时间:2018-06-21 09:09:42

标签: python django

我有两个模型:Offer and Items。我的报价始终具有可变数量的项目,这些项目具有价格。现在,我想显示每个优惠的商品总价。

我该怎么做?

这些是我的模特:

class Offer(models.Model):
    name = models.CharField(default="", verbose_name='Offername', blank=False, max_length=255)
    date = models.DateTimeField(default=django_now, verbose_name='Date')
    number = models.TextField(default="", verbose_name='Offernumber', blank=True)

class Item(models.Model):
        number = models.CharField('Nr.', blank=False, default="", max_length=10)
        description = models.TextField(default="", blank=False, verbose_name='Beschreibung')
        costs = models.DecimalField('Price', blank=False, default=0, decimal_places=2, max_digits=10)
        offer = models.ForeignKey('Offer', null=True, verbose_name="Angebot", related_name="items", on_delete=models.CASCADE)

我想做的是显示属于一个要约的所有ITEMS的总和。假设我有2个要约,每个要约都有一个DetailView,在这个DetailView中,我显示每个要约的商品。优惠1有3个项目,优惠2有9个项目。现在,我要为要约1显示3个项目的总和,并为要约2显示其9个项目的总和,依此类推。

修改:我的视图

class OfferDetailView(DetailView):
    model = Offer
    template_name = 'offers/offer_detail.html'
    context_object_name = 'offer'

3 个答案:

答案 0 :(得分:1)

编辑

为此,您将必须覆盖DetailView行为:

class OfferDetailView(DetailView):
    model = Offer
    template_name = 'offers/offer_detail.html'
    context_object_name = 'offer'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        offer = self.object
        total_item_cost = sum([i.cost for i in offer.item])
        context['total_item_cost'] = total_item_cost
        return context

,并在模板中:{{ total_item_cost }}

(请参阅this part of the doc

初始答案

我认为最简单的方法是使用django annotation在数据库级别执行求和。另请参见this

类似的方法可能有效(未经测试):

from django.db.models import Sum
offers = Offer.objects.all().annotate(total_costs=Sum("item__costs"))

在模板中,您现在可以使用:

{% for offer in offers %}
 {{ offer.total_costs  }}
{% endfor %}

答案 1 :(得分:0)

我想您可以执行类似的操作以解决您的情况。

from django.db.models import Sum

def get_total_item_offer(self):
    total_items = Offer.objects.all()
    return self.get_total_item.total_items.all().aggregate(sum=Sum('total')['sum']

答案 2 :(得分:0)

Django注释将起作用。在您的报价模型中添加

 def get_total_price(self):
     return self.objects.annotate(total_price_sum=Sum("item__costs"))

每个报价模型现在都有一个名为total_price_sum的字段,其中包含与之关联的每个模型的总价格