如何计算对象的值?

时间:2015-05-26 16:24:41

标签: python django

我创造了商店。我有两个模型:

我的模特:

class Product(models.Model):
    name = models.CharField(verbose_name="name", max_length=40)
    cost = models.FloatField(verbose_name="price")

    def __unicode__(self):
        return self.name

class Shop(models.Model):
    product = models.ManyToManyField(Product)
    name = models.CharField(verbose_name="Nazwa", max_length=40)
    budget = models.FloatField(verbose_name="kwota")

    def __unicode__(self):
        return self.name

我创建了模板,现在我的商店名称和产品价格如下:

enter image description here

我怎么算这个价格?例如,在这张图片上,我选择了总数= 17的产品。我应该在视图中创建一些内容,然后将其放入模板中,还是只在模板中编写?

现在我有类似的东西:

{% for p in shop.product.all %}
        {{p.cost}} 
{% endfor %}

但接下来呢?它只显示了这个值,但是如何对此进行数学运算?我不知道。

我的观点:

def shop_detail(request, pk):
    shop = get_object_or_404(Shop, pk=pk)
    return render(request, 'shopbudget/shop_detail.html', {'shop': shop})

现在我应该创造什么?我创建了类似的东西:

def sum_of_count(request):
    total = 0
    for cost in shop.product.all:
        total = total + cost
        return total

3 个答案:

答案 0 :(得分:2)

您应该为Shop模型添加一个功能,例如:

def count_cost(self):
    products = self.product.all()
    return sum(p.cost for p in products)

最后在你的模板中:

{{ shop.count_cost }}

正如Martin建议计算应该在数据库级别进行,为了提高性能,我建议改为:

from django.db.models import Sum

def count_cost(self):
    cost_sum = self.product.all().aggregate(total=Sum('cost'))
    return cost_sum['total']

答案 1 :(得分:2)

@willemoes描述的方法确定并且有效,我唯一关心的是在python而不是数据库级别进行计算(性能提升)。 我建议你在db级别进行计算,在你的模型类(Shop)中你可以添加以下内容。

from django.db.models import Sum

def calculate_cost(self, default=0.0):
    cost = Product.objects.filter(shop__id=shop_pk).aggregate(total=Sum('cost'))
    return cost['total'] or default

该代码不应该是昂贵的,但如果它开始需要一些时间来返回,你可以"缓存"使用" django缓存"进行计算或" @ cached_property"。 使用django' cache framework

def total_cost(self, default=0.0, expire=300):
    key = "pcost_%s" % self.pk
    cost = cache.get(key)
    if cost:  # cache found!
        return cost

    cost = Product.objects.filter(shop__id=shop_pk).aggregate(total=Sum('cost'))
    value = cost['total'] or default
    cache.set(key, value, expire)  #after expire seconds will be deleted
    return value

使用@cached_property

from django.utils.functional import cached_property

@cached_property
def total_cost(self):
    cost = Product.objects.filter(shop__id=shop_pk).aggregate(total=Sum('cost'))
    return cost['total'] or 0.0

@cached_property使用memoization。它是一个普通的蟒蛇属性。如果你想使"缓存"无效要强制重新计算你必须做的事情:

# see the @cached_property docs for more info
del your_model_instance.total_cost

希望它可以帮到你!

答案 2 :(得分:1)

试试这个:

from django.db.models import Sum

Shop.objects.filter(pk=pk).aggregate(sum_of_count=Sum('product__cost'))

这应该返回Shop对象中每个产品成本的总和。