首页 > 解决方案 > 按相关字段排序 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)

我正在使用代码值策略在未来添加不同的统计信息,而无需向模型添加新字段。

现在,我想列出所有玩家,所以我的问题是:

例如,有没有办法根据球员的进球数来排序?

标签: djangodjango-modelsdjango-queryset

解决方案


您需要使用带条件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,它等于valueonly if code == goals,否则它等于 0。从现在开始我要做的就是按此字段排序。


推荐阅读