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"和父级视图的tickerlookup字段自动生成的路由参数名。
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
相关产品推荐
相关产品推荐

