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

DRF Django使用drf-nested-routers配置反向外键关联数据查询

解决方案

问题根源

当前StockPriceViewSet未对嵌套路由传递的父级股票参数做过滤,因此访问嵌套路由时会返回全量StockPrice数据。

具体修改步骤

1. 重写StockPriceViewSet的get_queryset方法,添加父级过滤逻辑

修改prices.views中的StockPriceViewSet代码:

class StockPriceViewSet(viewsets.ModelViewSet):
    queryset = StockPrice.objects.all()
    serializer_class = StockPriceSerializer

    # 新增过滤逻辑
    def get_queryset(self):
        # 从嵌套路由参数中获取父级股票ticker,过滤对应价格数据
        return super().get_queryset().filter(
            ticker__ticker__iexact=self.kwargs["stocks_ticker"]
        )

注:stocks_ticker是drf-nested-routers根据你路由配置的lookup="stocks"和父级视图的ticker lookup字段自动生成的路由参数名。

2. (可选但推荐)新增自动填充外键逻辑

避免创建价格数据时需要前端重复传递ticker参数,新增perform_create方法:

def perform_create(self, serializer):
    # 自动获取当前路由对应的股票对象,填充外键
    stock = Stock.objects.get(ticker__iexact=self.kwargs["stocks_ticker"])
    serializer.save(ticker=stock)

3. (可选语义优化)修正模型字段歧义配置

当前StockPrice的ticker外键related_name设为stocks容易产生混淆,建议修改为更符合语义的prices:

# prices.models 中StockPrice类的ticker字段修改为
ticker = models.ForeignKey(
    "stocks.Stock", on_delete=models.CASCADE, related_name="prices"
)

# 同步修改StockViewSet的预加载配置
queryset = queryset.prefetch_related("prices")

修改完成后再次访问/stocks/aapl/price就只会返回对应股票的价格数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:09:03