Django ORM 过滤器 SUM 不同的相关对象
Django ORM filter SUM different related objects
我有以下型号:
class Developer(models.Model):
name = models.CharField(max_length=100)
class Skill(models.Model):
code = models.CharField(max_length=30)
class Experience(models.Model):
date_from = models.DateField(blank=True, null=True)
date_to = models.DateField(blank=True, null=True)
developer = models.ForeignKey(Developer, related_name='experience',
on_delete=models.CASCADE)
class SkillExperience(models.Model):
skill = models.ForeignKey(Skill, on_delete=models.CASCADE, related_name='skill_experience')
experience = models.ForeignKey(Experience, on_delete=models.CASCADE, related_name='skill_experience')
years_experience = models.IntegerField()
我需要一个查询来检索 years_experience 技能代码 'python' 至少为 5 的开发人员。但是我不能简单地做 Developer.objects.filter(skill_experience__years_experience__gte=5)
,因为我可以在 Python 中有两次经验,但一次是 3 年,另一次是 2 年,并且不会显示在上面的查询中。所以我需要总结来自 skill__code="Python" 的所有 years_experience 并对其进行评估。有什么方法可以通过单个查询来完成吗?
是的,你可以用.annotate(…)
[Django-doc]总结years_experience
,然后过滤total_years
:
from django.db.models import Sum
Developer.objects.filter(
# filter on Python skills (so exclude for example Java)
experience__skill_experience__skill__code='Python'
).annotate(
# sum up these years
<b>total_years=Sum('experience__skill_experience__years_experience')</b>
).filter(
# check if the total is at least five
<b>total_years__gte=5</b>
)
我有以下型号:
class Developer(models.Model):
name = models.CharField(max_length=100)
class Skill(models.Model):
code = models.CharField(max_length=30)
class Experience(models.Model):
date_from = models.DateField(blank=True, null=True)
date_to = models.DateField(blank=True, null=True)
developer = models.ForeignKey(Developer, related_name='experience',
on_delete=models.CASCADE)
class SkillExperience(models.Model):
skill = models.ForeignKey(Skill, on_delete=models.CASCADE, related_name='skill_experience')
experience = models.ForeignKey(Experience, on_delete=models.CASCADE, related_name='skill_experience')
years_experience = models.IntegerField()
我需要一个查询来检索 years_experience 技能代码 'python' 至少为 5 的开发人员。但是我不能简单地做 Developer.objects.filter(skill_experience__years_experience__gte=5)
,因为我可以在 Python 中有两次经验,但一次是 3 年,另一次是 2 年,并且不会显示在上面的查询中。所以我需要总结来自 skill__code="Python" 的所有 years_experience 并对其进行评估。有什么方法可以通过单个查询来完成吗?
是的,你可以用.annotate(…)
[Django-doc]总结years_experience
,然后过滤total_years
:
from django.db.models import Sum
Developer.objects.filter(
# filter on Python skills (so exclude for example Java)
experience__skill_experience__skill__code='Python'
).annotate(
# sum up these years
<b>total_years=Sum('experience__skill_experience__years_experience')</b>
).filter(
# check if the total is at least five
<b>total_years__gte=5</b>
)