Python 如何将django中许多字段的字段相加?

Python 如何将django中许多字段的字段相加?,python,django,aggregate-functions,django-orm,manytomanyfield,Python,Django,Aggregate Functions,Django Orm,Manytomanyfield,我正在Django中创建一个报价生成器。我想计算所有项目的总数,将其插入字段并保存 模型如下: from django.db import models from django.core.urlresolvers import reverse class Product(models.Model): product_name = models.CharField(max_length=50) product_description = models.CharField(max

我正在Django中创建一个报价生成器。我想计算所有项目的总数,将其插入字段并保存

模型如下:

from django.db import models
from django.core.urlresolvers import reverse


class Product(models.Model):
    product_name = models.CharField(max_length=50)
    product_description = models.CharField(max_length=200)
    product_price = models.IntegerField(max_length=4)

    def __unicode__(self):
        return self.product_name

    class Meta:
        ordering = ('product_name',)


class Quote(models.Model):
    quotee_name = models.CharField("Name", max_length=40)
    quotee_email = models.EmailField("Email")
    quotee_phone = models.IntegerField("Phone", max_length=10)
    quotee_products = models.ManyToManyField(Product, verbose_name="Products")
    quotee_total = models.IntegerField("Estimate", max_length=10, null=True, blank=True)

    def __unicode__(self):
        return self.quotee_email

    class Meta:
        ordering = ('quotee_email',)

    def get_absolute_url(self):
        return reverse('quote-detail', kwargs={'pk': self.pk, })
我不是通过管理员使用它,因此这里是forms.py:

from django import forms
from django.forms import CheckboxSelectMultiple


from InternalDusettenet.apps.quotes.models import Quote


class QuoteForm(forms.ModelForm):

    class Meta:
        model = Quote
        fields = ('quotee_name', 'quotee_email', 'quotee_phone',
                  'quotee_products')
        widgets = {
            'quotee_products': CheckboxSelectMultiple(attrs={'size': 10}),
        }
这是views.py文件。我将其设置为只将“1”保存到表单中,以便它实际保存。我想要的是用一个函数替换“1”,该函数为“Quote.quotee\u products”中选择的每个产品返回“Product.Product\u price”的值。当我创建报价单时,我选择产品,它会给出与所选产品相关的所有所选“产品价格”字段的总和:

from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.views.generic import ListView, DetailView
from django.shortcuts import Http404, get_object_or_404

from InternalDusettenet.apps.quotes.models import Quote
from InternalDusettenet.apps.quotes.forms import QuoteForm


class QuoteCreate(CreateView):
    model = Quote
    template_name = "quotes/quote_create_edit.html"
    fields = ['quotee_name', 'quotee_email', 'quotee_phone',
              'quotee_products']
    form_class = QuoteForm

    def form_valid(self, form):
        form.instance.quotee_total = 1
        return super(QuoteCreate, self).form_valid(form)


class QuoteList(ListView):
    model = Quote
    template_name = "quotes/quote_list.html"


class QuoteDetail(DetailView):
    model = Quote
    template_name = "quotes/quote_detail.html"


class QuoteUpdate(UpdateView):
    model = Quote
    template_name = "quotes/quote_create_edit.html"
    fields = ['quotee_name', 'quotee_email', 'quotee_phone',
              'quotee_products', 'quotee_total']
    form_class = QuoteForm


class QuoteDelete(DeleteView):
    model = Quote
    success_url = '/'
    template_name = "quotes/quote_delete.html"
我已经读了很多次Django文档,但我不知道如何做这件简单的事情


我正在使用Django 1.7和Python 2.7。

没有理由将其保存在数据库中,只需将其作为
Quote
对象的方法或属性:

class Quote(models.Model):
    ...
    def quotee_total(self):
        return self.quotee_products.aggregate(total=models.Sum('product_price'))['total']
如果需要,您可以缓存该值并在初始查询中填充缓存:

class Quote(models.Model):
    ...
    def quotee_total(self):
        if not hasattr(self, '_quotee_total'):
            self._quotee_total = self.quotee_products.aggregate(total=models.Sum('product_price'))['total']
        return self._quotee_total

quotes = Quote.objects.annotate(_quotee_total=models.Sum('quotee_products__product_price'))

当然,您可以将该值保存在数据库中,但没有什么理由。如果您担心性能,那么最好使用缓存,而不是将值保存到数据库

我不会在视图中计算总数。作为一种方法,这更有意义

class Quote(models.Model):

    def calculate_quotee_total(self):
        return sum(product.product_price for product in self.quotee_products.all())

    def __save__(self):
        self.quotee_total = self.calculate_quotee_total()
        super(Quote, self).save()
Quote.quotee_总计也可以根据需要进行计算,而不是保存在数据库中

class Quote(models.Model):

    @property
    def quotee_total(self):
        return sum(product.product_price for product in self.quotee_products.all())

使用aggregate()可能比我建议的方法更有效。注意:Sum()函数不应与内置python函数Sum()混淆。使用django.db.models导入Sum@HåkenLid编写
模型。Sum
因为
模型
已经导入了:P这应该足够清楚,但是谢谢你的注释。哇。这么多评论。非常感谢大家。对于这一点,我需要查看引号的唯一原因是在视图中。它不需要存储在数据库中。我只需要在查询特定报价时准备好总数。很抱歉我是新手,但如果像第一个示例中那样将其作为一种方法,我如何能够通过视图/模板调用它?再一次。对不起,没有收到。哈哈。我通常很擅长把事情弄清楚,但这件事让我很困惑。谢谢。如果
quote
是您的
quote
实例,请在视图中使用
quote.quotee_-total()
,在模板中使用
{{quote.quotee_-total}
。除了
self
之外没有参数的函数和方法会在模板中自动调用。好东西!谢谢我的头在穿墙,我知道这很简单。如果我还有任何问题,我会回来的,但这是非常简洁的。