我的模型大大简化了,我有以下内容:
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)
我正在使用代码值策略在将来添加不同的统计信息,而无需在模型中添加新字段。
现在,我想列出所有球员,所以我的问题是:
例如,有什么方法可以通过得分来对球员进行排序吗?
答案 0 :(得分:1)
您需要对条件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。从现在开始,我要做的就是以此排序字段。
答案 1 :(得分:0)
根据@Daniel Kusy的回答,我发现可以针对我的特定情况进行一些小修改的灵感,其中按得分目标对玩家进行排序如下:
from django.db.models import Case, When, F, Value, IntegerField
Players.objects.all().annotate(
goals=Case(
When(statistics__code="goals", then=F("statistics__value")),
default=Value(0),
output_field=IntegerField()
)).order_by("-goals")