我有两个模型,
Player
- id: int
- name: string
Ball
- type: string
- player_id: int
基本上,这个想法是玩家可以拥有一定数量的球。球的类型可以是BIG或SMALL(存储为字符串值)在ball.type
中现在我想根据计算的声誉对球员进行排序。声誉的公式如下
reputation = No of Big balls x 10 + No of Small balls
因此,例如,拥有一个大球和一个小球的球员的声誉将是11。
谁能告诉我如何根据这个声誉来订购用户?谢谢你的帮助。
您可以尝试注释并使用它来订购:
from django.db.models import Count, Q, Value
Player.objects.all().annotate(reputation=Count('ball', filter=Q(ball__type="BIG")) * Value(10) + Count('ball', filter=Q(ball__type="SMALL"))).order_by('reputation')
您可以使用DjangoManager
类。考虑以下代码:
class PlayerManager(models.Manager):
def with_reputation(self):
# using the formula from "Abdul Aziz Barkat"
return self.annotate(reputation = Count('ball', filter=Q(ball__type="BIG")) * Value(10) +
Count('ball', filter=Q(ball__type="SMALL")))
,在你的玩家模型中,你使用with_reputation来生成一个带有声誉注释的查询集,你可以对其进行排序
class Player(models):
objects = PlayerManager()
现在在你的代码中,你可以使用Players.objects.with_reputation()来获得一个带有注释reputation
添加到每条记录的查询集。然后你可以用它来排序
Players.objects.with_reputation().order_by('reputation')
或:
Players.objects.with_reputation().filter(name='Sam').ordere_by('reputation')
你可以在这里阅读更多关于经理的信息:https://docs.djangoproject.com/en/3.1/topics/db/managers/