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

Django3中ModelSerializer如何正确获取外键关联表字段

问题原因
  • 你贴的初始代码存在拼写错误:serailizers.ModelSerailizer为错误写法,正确类名是serializers.ModelSerializer,该拼写错误本身就会触发运行报错。
  • Django REST Framework的ModelSerializer不支持在fields列表中直接使用ORM查询的双下划线(__)语法声明跨关联表字段,双下划线语法仅适用于ORM的filter、values等查询操作,序列化层需要单独指定字段取值来源。
正确实现方式

直接在序列化器中显式声明需要的跨表字段,通过source参数指定字段的取值路径,和你预期的返回字段名对齐即可:

from rest_framework import serializers
from .models import Review

class ReviewSerializer(serializers.ModelSerializer):
    name = serializers.CharField(source="customer.name", read_only=True)
    title = serializers.CharField(source="movie.title", read_only=True)

    class Meta:
        model = Review
        fields = ["id", "name", "title"]
性能优化提示

查询评论数据时,使用select_related提前预加载关联的Customer和Movie数据,避免产生N+1查询问题,视图层查询示例:

# 预加载关联表数据,减少数据库查询次数
review_queryset = Review.objects.select_related("customer", "movie").all()
# 序列化返回
serializer = ReviewSerializer(review_queryset, many=True)
return Response(serializer.data)

说明:上述代码中给跨表字段加了read_only=True,是因为name、title属于关联表的属性,正常创建/更新Review时应该传递customer、movie的外键ID,而非直接传关联表的name、title值。如果你的业务场景需要通过name、title写入关联关系,可以去掉该参数,额外实现对应的create/update逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:16:19