我不知道怎么说标题。但请在这里查看:
我的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
。
答案 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 %}