小编Ahm*_*amy的帖子

Django 用 Sum 进行多重注释得到错误的答案

我试图.annotate()与多个一起使用Sum()但我得到了错误的计算。我读过我应该使用它Subquery,但我没有用它完成它,也许我以错误的方式使用它(因为这是第一次)或者它不能解决我的问题。

#managers.py

class DonationQuerySet(QuerySet):

    def completed(self):
        return self.with_donations_stats().filter(
            amount__lte=F('total_donation'), deleted_at=None)

    def not_completed(self):
        return self.with_donations_stats().filter(
            amount__gt=F('total_donation'), deleted_at=None)

    def with_donations_stats(self):
        return self.annotate(
            wallet_donation=Coalesce(Sum('wallet_transaction__amount'), 0),
            normal_donation=Coalesce(Sum('transactions__amount'), 0),
            total_donation=F('wallet_donation') + F('normal_donation'))


class DonationManager(Manager):
    def get_queryset(self):
        return DonationQuerySet(self.model, using=self._db)

    def completed(self):
        return self.get_queryset().completed()

    def not_completed(self):
        return self.get_queryset().not_completed()

    def with_donations_stats(self):
        return self.get_queryset().with_donations_stats()
Run Code Online (Sandbox Code Playgroud)
#models.py

class Transaction(models.Model):
    def __str__(self):
        return self.payment_id + ' - ' + self.status

    condition = models.ForeignKey('condition.Condition', related_name='transactions',
                                  on_delete=models.CASCADE) 
    
    amount = models.IntegerField(null=False, blank=False)

class WalletTransaction(AbstractBaseModel):
    condition = models.ForeignKey("condition.Condition", on_delete=models.SET_NULL, …
Run Code Online (Sandbox Code Playgroud)

python django orm django-models

2
推荐指数
1
解决办法
1885
查看次数

标签 统计

django ×1

django-models ×1

orm ×1

python ×1