首页 > 解决方案 > Django ORM:区分和注释

问题描述

假设我有一张这样的桌子:

class Developer(models.Model):
    first_name = models.CharField(max_length=255)
    last_name= models.CharField(max_length=255)
    team = models.CharField(max_length=255)
    closed_tickets = models.IntegerField()

    objects = DeveloperManager()

我想写一个返回的查询:

编写 SQL 以显示每个开发人员关闭的团队票证的百分比,并按贡献级别对开发人员进行排名。像这样的东西: 在此处输入图像描述 有没有办法在一个查询中做到这一点?

我试图用不同的子句来思考注释的方向

class DeveloperManager(models.Manager):
    def rank(self):
        return self.order_by('team').annotate(
            total=models.Sum(
                'closed_tickets'
            ),
            piece=models.F('closed_tickets') / models.F('total'),
        ).distinct('team').values()

但它返回给我一个错误:

NotImplementedError: annotate() + distinct(fields) is not implemented.

标签: sqldjangopostgresqldjango-models

解决方案


的原因NotImplementedError

让您知道您目前无法将 annotate 和 distinct (with fields) 组合在一起,这意味着它现在不起作用。(@Chris Pratt 在这个问题的评论中说)

也许这有帮助:

Developer.objects.raw("""
    select *, rank() over (partition by team order by percentage desc) as rank
    from (
          select *,
                 closed_tickets * 100 / (
                     select sum(closed_tickets) total
                     from t_developer
                     where team = tmp1.team
                     group by team
                 ) percentage
          from t_developer tmp1
    );
""")

推荐阅读