如何解决按相关字段带有代码值对Django查询集进行排序
我的模型大大简化了,我有以下内容:
class Player(models.Model):
name = models.CharField(max_length=50)
number = models.IntegerField()
class Statistic(models.Model):
'''
Known codes are:
- goals
- assists
- red_cards
'''
# Implicit ID
player = models.ForeignKey(
'Player',on_delete=models.CASCADE,related_name='statistics')
code = models.CharField(max_length=50)
value = models.CharField(max_length=50,null=True)
我正在使用代码值策略在将来添加不同的统计信息,而无需在模型中添加新字段。
现在,我想列出所有球员,所以我的问题是:
例如,有什么方法可以通过得分来对球员进行排序吗?
解决方法
您需要对条件Case
语句使用注释。
from django.db.models import Case,When,F,Value,IntegerField
Statistic.objects.all().annotate(
goals=Case(
When(code="goals",then=F("value")),default=Value(0),output_field=IntegerField()
)).order_by("-goals")
您的查询集现在具有附加字段goals
,只有value
时该字段才等于code == goals
,否则等于0。从现在开始,我要做的就是以此排序字段。
根据@Daniel Kusy的回答,我发现可以针对我的特定情况进行一些小修改的灵感,其中按得分目标对玩家进行排序如下:
from django.db.models import Case,IntegerField
Players.objects.all().annotate(
goals=Case(
When(statistics__code="goals",then=F("statistics__value")),output_field=IntegerField()
)).order_by("-goals")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。