Django模型加入模板表的视图查询集

时间:2016-02-02 21:16:53

标签: python django django-models django-queryset

我需要一些帮助才能尝试将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>

非常感谢你的帮助。

2 个答案:

答案 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() 模型将包含有关DonationDonor

之间关系的额外信息

现在您可以执行以下操作

Charity

因此,在您的模板中,您可以轻松使用它。您可以在此处https://docs.djangoproject.com/en/1.9/topics/db/models/#extra-fields-on-many-to-many-relationships

了解有关此主题的更多信息