繁体   English   中英

Django ORM filter 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()

例如,我需要一个查询来检索技能代码“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
    total_years=Sum('experience__skill_experience__years_experience')
).filter(
    # check if the total is at least five
    total_years__gte=5
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM