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

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:

  1. 调整查询逻辑:
assets = Asset.objects.filter(devUserId=devUserId).values('assetId', 'devUserId_id', 'keywordId', ...其他需要的字段)
  1. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:54:02