You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按Release对应主Credit的Entity名称对其进行排序?

解决方案:基于主Credit的Entity名称排序Release集合

你当前的get_credits_primary方法只能对单个Release的主Credit列表排序,但要实现整个Release集合按主Credit的Entity名称排序,需要在QuerySet层面通过数据库注解(annotate)结合子查询来实现,避免缓存带来的维护问题。

方法一:使用Case/When + 聚合函数(适合单主Credit场景)

如果每个Release对应唯一的主Credit(比如一部电影只有一个导演),可以直接用Case匹配不同类型对应的角色,再通过Min或Max聚合取Entity名称:

from django.db.models import Case, When, Value, CharField, Min, F

# 构建注解并排序
sorted_releases = Release.objects.annotate(
    primary_entity_name=Min(
        Case(
            When(type='GA', credits__role__name='Developer', then=F('credits__entity__name')),
            When(type='MO', credits__role__name='Director', then=F('credits__entity__name')),
            When(type='TV', credits__role__name='Showrunner', then=F('credits__entity__name')),
            When(type='MU', credits__role__name='Primary Artist', then=F('credits__entity__name')),
            When(type='BO', credits__role__name='Author', then=F('credits__entity__name')),
            When(type='BU', then=Value('')),
            output_field=CharField(),
        )
    )
).order_by('primary_entity_name')

方法二:使用Subquery(支持多主Credit场景)

如果一个Release可能有多个主Credit(比如多个开发者),用子查询取排序后的第一个Entity名称,保证排序逻辑和get_credits_primary一致:

from django.db.models import Subquery, OuterRef, Case, When, Value, CharField

# 定义子查询:获取当前Release的主Credit并按entity__name排序,取第一个名称
primary_credit_subquery = Credit.objects.filter(
    release=OuterRef('pk'),
    role__name=Case(
        When(release__type='GA', then=Value('Developer')),
        When(release__type='MO', then=Value('Director')),
        When(release__type='TV', then=Value('Showrunner')),
        When(release__type='MU', then=Value('Primary Artist')),
        When(release__type='BO', then=Value('Author')),
        default=Value('none'),
        output_field=CharField(),
    )
).order_by('entity__name').values('entity__name')[:1]

# 注解后排序
sorted_releases = Release.objects.annotate(
    primary_entity_name=Subquery(primary_credit_subquery)
).order_by('primary_entity_name')

关键说明

  • 这两种方法都在数据库层面完成排序,避免了Python内存中排序的性能问题,也无需维护缓存(缓存会面临数据更新同步的问题)。
  • 对于BU类型(无主角色),可以设置默认值为空字符串,排序时会排在最前或最后(取决于数据库排序规则)。
  • 若要倒序排序,只需将order_by('primary_entity_name')改为order_by('-primary_entity_name')。

内容的提问来源于stack exchange,提问作者bur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:03:25