【问题标题】:Django Sum in AnnotateAnnotate 中的 Django Sum
【发布时间】:2021-01-30 09:35:33
【问题描述】:

下午好,

我真的很难在 DJango 中使用 Annotate 来获得总和。

我正在使用用户对象和以下模型:

class Depts(models.Model):
    dept_name = models.CharField(max_length=55)
    dept_description = models.CharField(max_length=255)
    isBranch = models.BooleanField(default=False)

    def __str__(self):
        return "{}".format(self.dept_name)


class UserProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profile')
    title = models.CharField(max_length=75)
    dept = models.ForeignKey(Depts, on_delete=models.CASCADE, related_name="dept", null=True)

class ActivityLog(models.Model):
    activity_datetime = models.DateTimeField(default=timezone.now)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='activity_user')
    activity_category = models.ForeignKey(ActivityCategory, on_delete=models.CASCADE, null=True, related_name='activity_cat')
    activity_description = models.CharField(max_length=100, default="Misc Activity")

class ActivityCategory(models.Model):
    activity_name = models.CharField(max_length=40)
    activity_description = models.CharField(max_length=150)
    pts = models.IntegerField()

    def __str__(self):
        return '%s' % (self.activity_name)

我需要做的是让一组部门汇总所有用户活动日志所获得的积分总和。

因此,用户是部门的一部分,他们进行活动,每个活动都属于活动类别,并具有关联的积分。如何使用 ORM 查询得到每个部门每个人的总分?

谢谢你,我似乎无法理解它。

【问题讨论】:

    标签: django django-models django-rest-framework django-orm


    【解决方案1】:

    你用总和来注释部门:

    from django.db.models import Sum
    
    Depts.objects.annotate(
        total_pts=Sum('dept__user__activity_user__activity_category__pts')
    )

    注意related_name=… parameter [Django-doc]reverse 中关系的名称,所以从 Depts 模型到 UserProfile 本例中的模型。因此,将其命名为(通常)没有多大意义 与前向关系相同。因此,您可能需要考虑将 dept 关系重命名为 userprofiles

    设置related_name='userprofiles'后查询为:

    from django.db.models import Sum
    
    Depts.objects.annotate(
        total_pts=Sum('userprofiles__user__activity_user__activity_category__pts')
    )

    【讨论】:

    • 你太棒了。并且非常有帮助...谢谢!以正确的方式看待它有助于理解它。
    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 2018-01-12
    • 2014-05-18
    • 2017-01-15
    • 2012-12-12
    • 1970-01-01
    • 2014-10-12
    • 2016-10-31
    相关资源
    最近更新 更多