Django聚合多个过滤器

时间:2018-01-06 16:02:27

标签: python django

我有一个Django项目,允许用户创建自己的项目并为每个项目添加多个技能。 我正在尝试编写一个视图,允许我显示每个技能的名称以及所有特定用户配置文件的已发布项目的技能计数。

例如,如果用户有三个项目,他们已经添加了技能“HTML”,我想在他们的个人资料上显示HTML(3),等等。

下面是我当前的代码,它主要用于显示所有用户项目中该技能的计数,而不是正在查看其个人资料的特定用户。

型号:

#accounts/models.py
class Profile(models.Model):
    #...
    skills          = models.ManyToManyField('skills.skill')

#projects/models.py
class Project(models.Model):
    user            = models.ForeignKey(User)
    #...
    published       = models.BooleanField(default=False)
    skills          = models.ManyToManyField('skills.skill')
    #...

#skills/models.py
class Skill(models.Model):
    name = models.CharField(max_length=100)

查看:

#accounts/views.py
def profile(request, username):
    user            = get_object_or_404(User, username=username)
    skill_counts    = Skill.objects.annotate(num_projects=Count('project')).filter(project__user_id=user.id).order_by('-num_projects')[:10]


    return render(request, 'accounts/profile.html', {
        'user': user, 
        'skill_counts': skill_counts,
        })

模板:

#accounts/templates/accounts/profile.html
{% for skill in skill_counts %}
    <div class="skill-container">
        <div class="label-skill">{{ skill.name }}</div> <div class="label-skill-count">
        {{skill.project_set.count}}</div>
    </div>
{% endfor %}

非常感谢任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

请注意,我已投票决定关闭此问题,因为此问题已得到解答here

基本上你需要使用django的条件表达式Case and When

以下是一个简短示例:

from django.db.models import Count, Case, When
# ...
Skill.objects.annotate(
    num_porjects=Count(Case(
        When(project__user_id=user.id, then=1),
        output_field=CharField(),
    ))
)