【问题标题】:Django ORM: distinct and annotateDjango ORM:区分和注释
【发布时间】:2020-12-10 01:29:41
【问题描述】:

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

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.

【问题讨论】:

    标签: sql django postgresql django-models


    【解决方案1】:

    NotImplementedError的原因是

    让您知道您不能将 annotate 和 distinct(与 字段)此时一起,这意味着它不能正常工作 现在。 (@Chris Pratt 在 this question 的 cmets 中说)

    也许这会有所帮助:

    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
        );
    """)
    

    【讨论】:

    • 你最后忘记了as foo。谢谢!
    猜你喜欢
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2017-11-27
    • 2017-04-24
    • 2019-01-22
    • 2016-10-06
    • 2021-11-03
    相关资源
    最近更新 更多