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
相关产品推荐
相关产品推荐

