Django使用AssetSerializer时出现devUserId字段KeyError问题求解
问题根因
你触发KeyError: 'devUserId'的核心原因是:ModelSerializer默认接收Django模型实例作为输入,而你的代码中调用了.values()方法,返回的是字典类型的QuerySet。Django会自动将模型中定义的外键字段在values返回的字典里重命名为字段名_id格式,也就是你的devUserId外键会变成devUserId_id,序列化时找不到对应字段就会抛出KeyError。
可行解决方案
方案1:直接传入模型实例(最推荐)
去掉.values()调用,直接将模型实例QuerySet传给序列化器即可,ModelSerializer本身就能正确处理模型实例的关联字段序列化,修改后的views.py代码如下:
class UserAsset(APIView): def get(self,request,devUserId): # 先校验传入的devUserId对应的用户是否存在 if not User.objects.filter(googleId=devUserId).exists(): raise Http404 assets = Asset.objects.filter(devUserId=devUserId) serializer = AssetSerializer(assets, many=True) return Response(serializer.data)
注意:你原本的
try-except Asset.DoesNotExist逻辑是无效的,只有get()查询会抛出该异常,filter()查询不到结果只会返回空QuerySet,不会抛异常,所以改为先校验用户是否存在更合理。
方案2:如果必须使用values()
如果你的业务场景确实需要提前调用.values(),可以显式指定外键字段的别名,同时修改序列化器对应字段的source:
- 调整查询逻辑:
assets = Asset.objects.filter(devUserId=devUserId).values('assetId', 'devUserId_id', 'keywordId', ...其他需要的字段)
- 调整AssetSerializer:
class AssetSerializer(serializers.ModelSerializer): devUserId = serializers.IntegerField(source='devUserId_id') class Meta: model = Asset fields = '__all__'
可选优化(返回关联用户信息)
如果你需要在返回资产信息的同时携带开发者的完整信息,可以在序列化器中嵌套用户序列化器:
class AssetSerializer(serializers.ModelSerializer): devUserId = UserSerializer(read_only=True) class Meta: model = Asset fields = '__all__'
内容的提问来源于stack exchange,提问作者Roy6801
相关产品推荐
相关产品推荐

