从ForeignKey获取值并将其SUM。 Django的

时间:2018-05-10 18:41:03

标签: python django

我不知道怎么说标题。但请在这里查看:

我的model.py

class Employee(models.Model):
    name = models.CharField(max_length=100)

class EmpLoan(models.Model):
    status = models.BooleanField('Status', default=False)
    nominal = models.DecimalField(max_digits=10, decimal_places=0)
    employee = models.ForeignKey(Employee, null=True, on_delete=models.SET_NULL, related_name='emploan')

class EmpInstallment(models.Model):
    nominal = models.DecimalField(max_digits=10, decimal_places=0)
    loan = models.ForeignKey(EmpLoan, related_name='empinstallment')
    created_at = models.DateTimeField(auto_now=True)

和我的views.py

class EmpLoanListView(ListView):
    context_object_name = 'emploans'
    model = models.EmpLoan

    def get_context_data(self, **kwargs):
        context = super(EmpLoanListView, self).get_context_data(**kwargs)
        context['form'] = EmpLoanForm()
        return context

和我的template_loan.html

{% for emploan in emploans %}
<tr>
  <td>{{ emploan.employee.name }}</td>
  <td>{{ emploan.nominal|intcomma }},-</td>
  <td>{{ emploan.installment.nominal|intcomma }},-</td>
</tr>
{% endfor %}

此处我尝试使用EmpInstallment访问emploan.installment.nominal模型中的数据,但它无法正常工作。

如何在我的情况下从ForeignKey和sum获取数据?...

它将返回get()返回多个ContentType - 它返回2!因为它将有多个值,所以我也需要sum

2 个答案:

答案 0 :(得分:0)

首先,该代码不会给出该错误;你应该总是发布你得到的实际错误和追溯。

要汇总每笔贷款的分期付款,您可以使用汇总。在这种情况下,您可以覆盖模型的get_queryset方法以添加该聚合调用。

def get_queryset(self):
    qs = super(EmpLoanListView, self).get_queryset()
    return qs.annotate(installment_sum=Sum('empinstallment__nominal'))

现在,就业人员中的每个项目都有一个额外的字段installment_sum,它对相关的分期付款值进行求和。

请注意,您需要从django.db.models导入Sum。

您可能还希望在该通话结束时添加.select_related('employee'),以减少查找员工姓名所需的通话次数。

答案 1 :(得分:0)

我认为@property方法会起作用:
对于每个EmpLoan个实例,您可以使用nominal ReverseRelation 访问其所拥有的总数EmpInstallment

from django.db.models import Sum

class EmpLoan(models.Model):
    status = models.BooleanField('Status', default=False)
    nominal = models.DecimalField(max_digits=10, decimal_places=0)
    employee = models.ForeignKey(Employee, null=True, on_delete=models.SET_NULL, related_name='emploan')

    @property
    def total_nominal(self):
        if self.empinstallment.all():
            return self.empinstallment.aggregate(Sum('nominal')).get('nominal__sum')
        # if don't need None value, just: return 0

在模板中,您将访问:

{% for emploan in emploans %}
<tr>
    <td>{{ emploan.employee.name }}</td>
    <td>{{ emploan.nominal|intcomma }},-</td>
    <td>{{ emploan.total_nominal|intcomma }},-</td>
</tr>
{% endfor %}