Джанго соединяется с суммой - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть две модели, Transaction и TransactionType.

class Transaction(models.Model):
    tran_date = models.DateField()
    tran_amount = models.FloatField(default=0.00)
    tran_payment_method = models.ForeignKey(PaymentMethod,on_delete=models.SET_NULL,null=True)
    tran_location = models.ForeignKey(Location,on_delete=models.SET_NULL,null=True)
    tran_type = models.ForeignKey(TransactionType,on_delete=models.SET_NULL,null=True)
    account = models.ForeignKey(User,on_delete=models.CASCADE,default='')
    create_date = models.DateTimeField(auto_now_add=True, blank=True)

class TransactionType(models.Model):
    name = models.CharField(max_length=200)
    status = models.IntegerField(default=1)  # 0:inactive 1:active
    income_ind=models.IntegerField(default=0) # 1: expense 2: income
    account = models.ForeignKey(User, on_delete=models.CASCADE,default='')
    create_date = models.DateTimeField(auto_now_add=True, blank=True)

Я хочу использовать ORM для запуска запроса, подобного приведенному ниже

select b.name,sum(a.tran_amount) as total
from Transaction a
inner join TransactionType b
on a.tran_type = b.id
where a.account=some_user_id and b.income_ind=1

Как мне реализовать это, не используя необработанный запрос

1 Ответ

0 голосов
/ 22 сентября 2018

Если TransactionType.name уникален (то есть нет двух TransactionType с именем с таким же ), тогда мы можем использовать .annotate(..) для этого:

from django.db.models import Sum

TransactionType.objects.filter(
    transaction__acount_id=some_user_id
    income_ind=1
).annotate(
    total=Sum('transaction__tran_amount')
)

Это приведет к QuerySet, который содержит TransactionType с, и каждый TransactionType будет иметь атрибут total, который является суммой tran_amount с для связанных Transaction с, для которых acount_id равно some_user_id (заполняется).

Кроме того, мы рассматриваем только TransactionType с, для которых income_ind равно 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...