这是一个问题的后续:
Filter查询其amount字段的总和大于或小于一个数字
应该被解出。答案建议使用带有过滤器的窗口函数,但这会导致错误:
django.db.utils.NotSupportedError: Window is disallowed in the filter clause.
来自@atabak hooshangi的评论建议删除Window函数,但在此之后查询不能正常工作。有什么办法可以解决这个问题吗?
假设我们有两个模型:
class Developer(models.Model):
first_name = models.CharField(max_length=40, null=False, blank=False,
unique=True)
last_name = models.CharField(max_length=40, null=False, blank=False,
unique=True)
profession = models.CharField(max_length=100, null=False)
cv = models.FileField(upload_to=upload_cv_location, null=True, blank=True)
description = models.TextField()
img = models.ImageField(upload_to=upload_location, null=True, blank=True)
class Meta:
verbose_name = 'Developer'
verbose_name_plural = 'Developers'
ordering = ('first_name',)
def __str__(self):
return f'{self.first_name} {self.last_name}'
class Skill(models.Model):
developer = models.ForeignKey(to=Developer, on_delete=models.CASCADE)
category = models.ForeignKey(to=SkillCategory, on_delete=models.SET_NULL,
null=True)
name = models.CharField(max_length=50, null=False)
priority = models.PositiveIntegerField()
class Meta:
ordering = ('-priority',)
def __str__(self):
return f'{self.name} skill of {self.developer}'
正如您所看到的,我们有一个与技能有关的开发人员模型。每个开发人员都可以拥有多种技能。
现在考虑我们想要得到优先级总和大于一个数字的开发人员。
表单查询应该这样工作:
from django.db.models import Sum
developers = Developer.objects.annotate(tot=Sum('skill__priority')).filter(tot__gt=250).all()
输出将是priority_sum值大于250的开发人员。
你可以以任何你想要的方式过滤tot,它是一个带注释的变量。
像.filter(tot__lte)
或.filter(tot__lt)
我希望这就是你要找的。