Django 4.2:如何按外键关联子表ProductRateInfo的sbr_rate排序
解决方案
首先明确:prefetch_related仅用于预取关联数据,无法实现按关联表字段排序的需求。以下是针对不同业务场景的正确实现方式:
场景1:按关联的所有ProductRateInfo中sbr_rate的最大值排序
通过annotate计算每个Product对应的最大费率值,再基于该值排序:
from django.db.models import Max # 升序排序,如需降序改为 '-max_sbr_rate' product_qs = Product.objects.filter(prduct_type='demotest').annotate( max_sbr_rate=Max('rate_info__sbr_rate') ).order_by('max_sbr_rate')
场景2:按当前生效季节的sbr_rate排序
如果需要基于当前日期处于season_start和season_end区间内的有效费率排序:
from django.db.models import F from datetime import date today = date.today() # 过滤出有生效费率的Product,按生效费率排序,通过distinct避免重复实例 product_qs = Product.objects.filter( prduct_type='demotest', rate_info__season_start__lte=today, rate_info__season_end__gte=today ).annotate( current_sbr_rate=F('rate_info__sbr_rate') ).order_by('current_sbr_rate').distinct()
场景3:每个Product仅对应一个ProductRateInfo
如果能确保每个Product只有一条关联的费率记录,可直接通过关联字段排序:
# 升序排序,如需降序改为 '-rate_info__sbr_rate' product_qs = Product.objects.filter(prduct_type='demotest').order_by('rate_info__sbr_rate')
额外提示
原代码存在拼写错误:Product.object应为Product.objects,fitler应为filter;模型中的prduct_type建议修正为product_type,避免后续查询出现异常。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

