django - 按相关字段排序 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
only if code == goals
,否则它等于 0。从现在开始我要做的就是按此字段排序。
推荐阅读
- nsis - NSIS 安装程序屏幕中的新自定义打印按钮未显示
- javascript - Thymeleaf JS 无法传递参数
- javascript - 重构javascript中的硬代码
- azure - IoT Workbench 中仅显示一个 Azure 订阅:Cloud Azure 配置命令
- angular - 如何对角度@Output 进行单元测试
- ios - Ionic Cordova Typescript iOS App - 自动从 BLE 检索数据
- css - 如何选择最后一个元素?
- javascript - 在 componentDidMount 或单击按钮时调用 API
- javascript - 在跨域 iframe 中获取 iframe id
- php - Symfony getData() 返回空值