按累积和和错误进行过滤的解决方案:filter子句中不允许使用窗口



这是一个问题的后续:

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)

我希望这就是你要找的。

相关内容

  • 没有找到相关文章

最新更新