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

使用to_field关联的Stock与Data模型嵌套序列化无数据返回问题

问题原因及解决方法

你遇到的问题核心是Django默认的反向关联名称和序列化器里的字段不匹配,导致DRF无法找到关联的Data数据。

具体原因

Django中,ForeignKey的反向关联默认名称是[模型名小写]_set,你的Data模型对应的反向关联名称是data_set,但你在StockSerializer里用的是data作为字段名,两者不匹配,所以无法返回关联数据。

两种解决方案

方案1:修改模型,指定反向关联名称

直接在Data模型的ForeignKey字段里添加related_name='data',让Stock实例可以通过.data直接访问关联的Data数据:

class Data(models.Model):
    model_number = models.ForeignKey(Stock, to_field='model_number', on_delete=models.CASCADE, related_name='data')
    price = models.FloatField()
    date = models.DateField()

    def __str__(self):
        return str(self.model_number)  # 原代码此处会报错,需将Stock实例转为字符串

方案2:不修改模型,在序列化器中指定source

如果不想改动模型,在StockSerializer里给data字段加上source='data_set',指向默认的反向关联名称:

class StockSerializer(serializers.ModelSerializer):
    data = DataSerializer(many=True, read_only=True, source='data_set')

    class Meta:
        model = Stock
        fields = ['brand', 'model', 'model_number', 'msrp', 'data']

额外注意事项

  • 确认数据库中存在Stock实例及其对应的Data关联数据,否则即使配置正确也会返回空列表。
  • 为了优化查询性能,建议在视图的查询集中使用prefetch_related预加载关联数据,避免N+1查询问题:
# 示例视图中的查询集(对应方案1的related_name)
queryset = Stock.objects.all().prefetch_related('data')
# 若用方案2,则改为prefetch_related('data_set')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:04:57