我需要一些帮助才能尝试将2个模型(但实际上是3个)加入到查询集中,这样我就可以在模板表中显示两个模型的值。
我将使用简单的捐赠者和慈善模式作为例子
class Donor(models.Model):
donor_name = models.CharField(50) #assuming only one donor in the system
class Charity(models.Model):
charity_name = models.CharField(50)
class AmountGiven(models.Model):
donor = models.ForeignKey(Donor)
charity = models.ForeignKey(Charity)
donation_date = models.DateField()
amount = models.IntegerField()
我正在寻找正确的查询集,我可以将其循环到一个表中,该表显示此查询将返回的人员捐赠的总金额
SELECT B.charity_name, sum(C.amount) as total
FROM customer A, product B, amount_given C
WHERE A.donor_name = C.donor
AND B.charity_name = C.charity
GROUP BY B.charity_name
ORDER BY b.charity_name
在一天结束时,我很乐意将结果放入一个列表,然后我可以循环到这样的表中
<table class="table table-condensed table-bordered">
{% for result in results %}
<tr>
<td>{{ result.charity_name }}</td>
<td>{{ result.total }}</td>
</tr>
{% endfor %}
</table>
非常感谢你的帮助。
答案 0 :(得分:0)
您可以执行以下操作:
from django.db.models import Sum
result = AmountGiven.objects.values('charity__charity_name').annotate(total=Sum('amount'))
https://docs.djangoproject.com/en/dev/topics/db/aggregation/#topics-db-aggregation
然后在你的模板中它应该是这样的:
<table class="table table-condensed table-bordered">
{% for result in results %}
<tr>
<td>{{ result['charity__charity_name'] }}</td>
<td>{{ result['total'] }}</td>
</tr>
{% endfor %}
</table>
答案 1 :(得分:0)
我认为我的解决方案基于更好的设计方法
您有捐赠者和慈善机构,根据我的理解,捐赠者可以捐赠给许多慈善机构,慈善机构可能会被许多捐赠者捐赠。在这种情况下,我们有availability
的关系。但是,它需要有关每种关系的额外信息。这在Django中调用ManytoMany
您在其中创建包含关系额外信息的模型。那么让我告诉你如何在你的情况下做到这一点。
Extra fields on many-to-many relationships
现在from django.db import models
from django.db.models import Sum
class Donor(models.Model):
name = models.CharField(max_length=128)
class Charity(models.Model):
name = models.CharField(max_length=128)
donations = models.ManyToManyField(Donor, through='Donation')
def donations_sum(self):
return self.donation_set.aggregate(s=Sum("amount"))["s"]
class Donation(models.Model):
donor = models.ForeignKey(Donor, on_delete=models.CASCADE)
charity = models.ForeignKey(Charity, on_delete=models.CASCADE)
donation_date = models.DateField(auto_now_add=True)
amount = models.PositiveIntegerField()
模型将包含有关Donation
和Donor
现在您可以执行以下操作
Charity
因此,在您的模板中,您可以轻松使用它。您可以在此处https://docs.djangoproject.com/en/1.9/topics/db/models/#extra-fields-on-many-to-many-relationships
了解有关此主题的更多信息