【问题标题】:Take value from ForeignKey and SUM it. Django从 ForeignKey 中获取值并对其求和。姜戈
【发布时间】:2018-05-11 03:22:54
【问题描述】:

我不知道如何在标题上说。但在这里检查一下:

我的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 %}

我在这里尝试使用emploan.installment.nominal 访问来自EmpInstallment 模型的数据,但它不起作用。

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

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

【问题讨论】:

    标签: python django


    【解决方案1】:

    我认为@property 方法会起作用:
    对于每个EmpLoan 实例,您可以从带有EmpInstallmentReverseRelation 访问nominal 的总数。

    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 %}
    

    【讨论】:

      【解决方案2】:

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

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

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

      现在,emploans 中的每个项目都有一个额外的字段installment_sum,用于汇总相关的分期付款值。

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

      您可能还想在通话末尾添加.select_related('employee'),以减少查找员工姓名所需的通话次数。

      【讨论】:

        猜你喜欢
        • 2016-09-18
        • 2021-03-13
        • 2022-01-22
        • 2017-06-15
        • 2020-10-31
        • 2020-08-17
        • 2019-01-04
        • 2017-09-19
        • 2017-05-05
        相关资源
        最近更新 更多