注释中的 Django Sum
Django Sum in Annotate
下午好,
我真的很难在 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)
我需要做的是让一组部门汇总所有用户获得的积分总和 activitylogs。
所以一个用户是部门的一部分,他们做活动,每个 activity 是一个类型 activity_category 并且有关联的点数。如何使用ORM查询得到每个部门每个人的积分总和?
谢谢,我似乎无法全神贯注。
您用总和注释部门:
from django.db.models import Sum
Depts.objects.annotate(
<b>total_pts=Sum('dept__user__activity_user__activity_category__pts')</b>
)
Note: The related_name=…
parameter [Django-doc]
is the name of the relation in reverse, so from the Depts
model to the UserProfile
model in this case. Therefore it (often) makes not much sense to name it the
same as the forward relation. You thus might want to consider renaming the dept
relation to userprofiles
.
设置related_name='userprofiles'
后查询为:
from django.db.models import Sum
Depts.objects.annotate(
<b>total_pts=Sum('userprofiles__user__activity_user__activity_category__pts')</b>
)
下午好,
我真的很难在 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)
我需要做的是让一组部门汇总所有用户获得的积分总和 activitylogs。
所以一个用户是部门的一部分,他们做活动,每个 activity 是一个类型 activity_category 并且有关联的点数。如何使用ORM查询得到每个部门每个人的积分总和?
谢谢,我似乎无法全神贯注。
您用总和注释部门:
from django.db.models import Sum
Depts.objects.annotate(
<b>total_pts=Sum('dept__user__activity_user__activity_category__pts')</b>
)
Note: The
related_name=…
parameter [Django-doc] is the name of the relation in reverse, so from theDepts
model to theUserProfile
model in this case. Therefore it (often) makes not much sense to name it the same as the forward relation. You thus might want to consider renaming therelation todept
userprofiles
.
设置related_name='userprofiles'
后查询为:
from django.db.models import Sum
Depts.objects.annotate(
<b>total_pts=Sum('userprofiles__user__activity_user__activity_category__pts')</b>
)