按相关字段(带有代码值)对Django查询集进行排序

时间:2020-08-11 09:19:06

标签: django django-models django-queryset

我的模型大大简化了,我有以下内容:

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)

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

现在,我想列出所有球员,所以我的问题是:

例如,有什么方法可以通过得分来对球员进行排序吗?

2 个答案:

答案 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")
相关问题