Django Rest Framework如何序列化多表得到合并嵌套的JSON输出
Django 序列化嵌套关联数据调整方案
修改序列化器(serialize.py)
你已经在QuarterlyFinance的外键字段设置了related_name='quarter_result',直接在股票序列化器中显式嵌套季度财务序列化器即可实现关联数据嵌套输出,修改后代码如下:
class QuarterlyFinanceSerialize(serializers.ModelSerializer): class Meta: model=QuarterlyFinance fields=['quarter_end', 'total_revenue','net_income'] class StocksSerialize(serializers.ModelSerializer): # 嵌套季度财务序列化器,source对应外键的related_name值 qtr_result = QuarterlyFinanceSerialize(many=True, read_only=True, source='quarter_result') class Meta: model=Stocks fields=["ticker", "company_name", "sector", "qtr_result"]
原代码中两处depth=1配置无实际作用已经移除,如果你有其他深度序列化需求可以自行加回。
修改视图(view.py)
不需要分开查询两个表再拼接结果,直接查询单条Stocks数据即可,嵌套序列化器会自动加载关联的季度财务数据,修改后代码如下:
class DataClassView(APIView): def get(self, request, format=None): # 原max_day逻辑如果无后续使用可以直接删除,保留也不影响功能 max_day = Advice.objects.latest('advice_date').advice_date max_day=max_day.strftime("%Y-%m-%d") # ticker是Stocks表主键,用get获取单个对象而非查询集 stk = Stocks.objects.get(ticker='TCS') stock_ser_obj = StocksSerialize(stk) return Response(stock_ser_obj.data)
补充说明
如果需要兼容查询多只股票的场景,把Stocks.objects.get换回filter方法,序列化时传入many=True参数即可,返回结果会是包含多只股票嵌套数据的数组。如果担心get方法查询不到数据抛出异常,可以加try-except捕获DoesNotExist异常后返回404响应。
内容的提问来源于stack exchange,提问作者shyam yadav
相关产品推荐
相关产品推荐

