【问题标题】:How to sort objects by a derived calculation?如何通过派生计算对对象进行排序?
【发布时间】:2018-03-22 08:19:56
【问题描述】:

我有一个名为Team 的课程,它有赢有输。
我希望能够按win_pct 对团队进行排序,这应该是获胜次数与总游戏数的比率(即wins.count()/(wins.count() + losses.count()))。

class Team(TimestampModerated):
    name = models.CharField(max_length=80, blank=False, null=False)
    wins = models.ManyToManyField('self', blank=True, symmetrical=False, related_name='related_wins')
    losses = models.ManyToManyField('self', blank=True, symmetrical=False, related_name='related_losses')

    def num_wins(self):
        return self.wins.count()

    def num_losses(self):
        return self.losses.count()

    def win_pct(self):
        return self.wins.count()/(self.wins.count() + self.losses.count())

所以,在我看来,我有这样的事情:

@list_route
def teams_list(self, request):
    teams = Team.objects.all().order_by('-win_pct')
    page = self.paginate_queryset(teams)
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        return self.get_paginated_response(serializer.data)
    serializer = self.get_serializer(teams, many=True)
    return Response(
        data=serializer.data
    )

但它只是给出一个错误:

django.core.exceptions.FieldError: Cannot resolve keyword 'win_pct' into a field. Choices are: created, id, losses, moderation_code, related_losses, related_wins, name, updated, wins

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    试试下面的代码

    from django.db.models import Count
    teams = Team.objects.all().annotate(
        win_pct=(Count('wins')/(Count('wins')+Count('losses')))).order_by('win_pct')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 2019-05-13
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      相关资源
      最近更新 更多