2016-02-02 1 views
0

Мне нужна помощь в попытке присоединиться к двум моделям (но действительно 3) в наборе запросов, чтобы я мог отображать значения из обеих моделей внутри таблицы шаблонов.Модель Django присоединяется к запросу queryset для таблицы шаблонов

Я буду использовать простой донор и благотворительность модель в качестве примера

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() 

Я ищу правильную QuerySet, которую я могу цикл в таблицу, которая показывает общую сумму, подаренный человеку, как это запрос возвратит

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

Вы можете сделать следующее:

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> 
0

Я даю свое решение на основе более глубокого подхода к проектированию на мой взгляд

У вас есть Донор и Благотворительность, и fr om мое понимание Донор может пожертвовать многим благотворительным организациям, и благотворительность может быть пожертвована многими донорами. В этом случае мы имеем отношение ManytoMany. Тем не менее, он нуждается в дополнительной информации о каждой связи. Это вызвано в Django 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

Теперь вы можете сделать следующее

## Create donors 
>>> mike = Donor.objects.create(name="Mike Smith") 
>>> john = Donor.objects.create(name="John Smith") 

# Create charites 
>>> charity1 = Charity.objects.create(name="Clean Beach") 
>>> charity2 = Charity.objects.create(name="Help Old People") 

# create donations 
>>> donation1 = Donation(donor=mike, charity=charity1, amount=2000) 
>>> donation2 = Donation(donor=mike, charity=charity2, amount=500) 
>>> donation3 = Donation(donor=john, charity=charity1, amount=1500) 

# now in order to get each charity total donations 
>>> charity1.donations_sum() ## 3500 

Таким образом, в шаблоне вы можете использовать его легко. Вы можете узнать больше об этой теме https://docs.djangoproject.com/en/1.9/topics/db/models/#extra-fields-on-many-to-many-relationships