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

Django REST单个GET请求嵌套返回Project关联数据的问题

错误原因分析

报错核心是属性名大小写不匹配:你在Userproject模型中定义的关联Project的外键字段名为小写的project,Python是大小写敏感的,你在SerializerMethodField对应的方法中调用了大写开头的obj.Project,自然会抛出属性不存在的错误。

正确实现方案

推荐两种可落地的实现方式,按需选择即可:

方案1:嵌套序列化器(性能更优,代码更简洁)

不需要使用SerializerMethodField,直接定义轻量的Project序列化器嵌套到目标序列化器中即可:

from rest_framework import serializers
from .models import Project, Userproject

# 先定义Project的简易序列化器,只保留你需要返回的字段
class ProjectSimpleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ['name', 'descriptor']

# 目标序列化器直接嵌套上述序列化器
class GetUserDataSerializer(serializers.ModelSerializer):
    # 字段名和你模型中外键字段名保持一致,指定嵌套序列化器
    project = ProjectSimpleSerializer(read_only=True)
    
    class Meta:
        model = Userproject
        # 替换下方...为你需要返回的其他Userproject字段即可
        fields = ['id', 'user', 'project', ...]

为了避免N+1查询问题,视图层查询时要加关联预加载:

# GetUserDataByNameView中查询集写法示例
user_projects = Userproject.objects.filter(user__username=传入的用户名参数).select_related('project')

方案2:SerializerMethodField实现(适合需要额外自定义逻辑的场景)

如果确实需要用SerializerMethodField做额外逻辑处理,注意属性名要和外键字段名保持小写一致:

class GetUserDataSerializer(serializers.ModelSerializer):
    project_info = serializers.SerializerMethodField()
    
    def get_project_info(self, obj):
        # 这里调用小写的obj.project,不要写大写的Project
        project_instance = obj.project
        return {
            "name": project_instance.name,
            "descriptor": project_instance.descriptor
        }
    
    class Meta:
        model = Userproject
        fields = ['id', 'user', 'project_info', ...]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:57:06