在聚合中使用过滤器或 Q
Using Filter or Q in Aggregation
class Streamer(models.Model):
name = models.CharField(max_length=50, null=True)
is_working_with_us = models.BooleanField(default=False)
class Account(models.Model):
streamer = models.ForeignKey(Streamer, on_delete=models.CASCADE)
salary= models.Decimalfield(decimal_places=2, max_digits=7)
cost= models.Decimalfield(decimal_places=2, max_digits=7)
我可以根据单个查询中的属性进行两个不同的聚合吗?如下所示。
streamer_salary_stats = Streamer.objects.filter(is_working_with_us=True).aggregate(
expensive_streamers_sum=Sum(Q(cost__gt=10000.0),'salary'), # with Q or
cheap_streamers_sum=Sum(cost__lte=10000.0,'salary'), # without Q
)
我知道可以通过这种方式完成,但想在单个查询中实现。
expensive_streamers_sum = Streamer.objects.filter(
is_working_with_us=True, cost__gt=10000.0
).aggregate(s=Sum('salary'))['s']
cheap_streamers_sum = Streamer.objects.filter(
is_working_with_us=True, cost__lte=10000.0
).aggregate(s=Sum('salary'))['s']
您可以使用 filter=…
parameter [Django-doc]:
streamer_salary_stats = Streamer.objects.filter(is_working_with_us=True).aggregate(
expensive_streamers_sum=Sum('salary'<strong>, filter=Q(cost__gt=10000.0)</strong>),
cheap_streamers_sum=Sum('salary'<strong>, filter=Q(cost__lte=10000.0)</strong>)
)
class Streamer(models.Model):
name = models.CharField(max_length=50, null=True)
is_working_with_us = models.BooleanField(default=False)
class Account(models.Model):
streamer = models.ForeignKey(Streamer, on_delete=models.CASCADE)
salary= models.Decimalfield(decimal_places=2, max_digits=7)
cost= models.Decimalfield(decimal_places=2, max_digits=7)
我可以根据单个查询中的属性进行两个不同的聚合吗?如下所示。
streamer_salary_stats = Streamer.objects.filter(is_working_with_us=True).aggregate(
expensive_streamers_sum=Sum(Q(cost__gt=10000.0),'salary'), # with Q or
cheap_streamers_sum=Sum(cost__lte=10000.0,'salary'), # without Q
)
我知道可以通过这种方式完成,但想在单个查询中实现。
expensive_streamers_sum = Streamer.objects.filter(
is_working_with_us=True, cost__gt=10000.0
).aggregate(s=Sum('salary'))['s']
cheap_streamers_sum = Streamer.objects.filter(
is_working_with_us=True, cost__lte=10000.0
).aggregate(s=Sum('salary'))['s']
您可以使用 filter=…
parameter [Django-doc]:
streamer_salary_stats = Streamer.objects.filter(is_working_with_us=True).aggregate(
expensive_streamers_sum=Sum('salary'<strong>, filter=Q(cost__gt=10000.0)</strong>),
cheap_streamers_sum=Sum('salary'<strong>, filter=Q(cost__lte=10000.0)</strong>)
)