所以我有下面的模型,它包含不同的布尔值和一个amount字段.

class UserTransaction(models.Model):
    """
    A table to store transactions between a user and Farena
    """
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    offer = models.ForeignKey(Offer, on_delete=models.CASCADE, blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    amount = models.FloatField()
    is_deposit = models.BooleanField(default=False)
    is_withdrawal = models.BooleanField(default=False)
    is_interest = models.BooleanField(default=False)
    is_investment = models.BooleanField(default=False)
    is_return = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.user.first_name} {self.user.last_name} transacted {self.amount}'

我试图用annotate来构建它,但这会 for each 实例添加字段,据我所知,这并不能解决我的问题.此外,使用aggregate我无法实现条件,也不知道如何访问模板中的聚合值?

推荐答案

您可以对所有字段进行聚合,因此:

UserTransaction.objects.aggregate(
    total_deposit=Sum('is_deposit'),
    total_withdrawal=Sum('is_withdrawal'),
    total_interest=Sum('is_interest'),
    total_investment=Sum('is_investment'),
    total_return=Sum('is_return')
)

或者对于某些bool未实现为整数的数据库:

UserTransaction.objects.aggregate(
    total_deposit=Count('pk', filter=Q(is_deposit=True)),
    total_withdrawal=Count('pk', filter=Q(is_withdrawal=True)),
    total_interest=Count('pk', filter=Q(is_interest=True)),
    total_investment=Count('pk', filter=Q(is_investment=True)),
    total_return=Count('pk', filter=Q(is_return=True))
)

这将返回一个如下所示的字典:

{
    'total_deposit': 14,
    'total_withdrawal': 25,
    'total_interest': 13,
    'total_investment': 2
    'total_return': 17
}

Django相关问答推荐

使用FormWizard将信息从视图传递到表单

Django中有修改字段值的挂钩吗?

如何在Django中将字段及其数据从一个模型添加到另一个模型?

如何在Django模板中获取组中对象的整体计数器(&Q;)?

如何删除Docker上的django应用程序?

情节主题更改问题

如何将数据(具体归档)从views.py 传递到models.py

在 Django 模板中呈现标签名称而不是整数字段

Django RESTful API - django-piston vs. django-tastypie

使用基于类的 UpdateView 在 Django 中更新用户模型

Django: Admin:在管理员中更改字段的小部件

CherryPy 与 Django

带有消息判断的 Django/Python assertRaises

我应该如何在我的模型中使用 DurationField?

如何在 django 中分离我的模型?

如何向所有 Django 响应添加 HTTP 标头

刷新时重新提交的django表单

Django:如何将数据保存到 ManyToManyField?

如何在 django 中捕获UNIQUE constraint failed404

ImportError:没有名为 django_filters 的模块