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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:07:13