如何按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
相关产品推荐
相关产品推荐

