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

DRF Coreapi调用自定义action成功后出现LinkLookupError如何解决

问题原因

这个错误是Django Rest Framework的CoreAPI schema生成器的自动推断逻辑导致的:你定义的tagsum自定义action没有显式声明操作元数据,首次请求完成后,生成器会把这个GET类型的非详情(detail=False)action错误识别为一个子资源的read操作,导致文档结构从records.tagsum变成了records.tagsum.read,原有路径找不到就抛出了LinkLookupError。

解决方案

你可以任选以下一种方案修复:

  • 方案一:补全@action装饰器的显式配置,避免自动推断出错
    给tagsum方法的装饰器加上methods、url_name、suffix参数,明确告知DRF该action的属性:

    @action(
        detail=False,
        methods=['get'], # 显式指定支持的请求方法
        url_path='tagsum/(?P<account>[^/.]+)/(?P<tag>[^/.]+)',
        url_name='tagsum', # 显式指定路由名称
        suffix='Tagsum' # 显式指定操作后缀,避免被识别为默认的read操作
    )
    def tagsum(self, request, account, tag):
        # 原有逻辑不变
    
  • 方案二:给自定义action指定序列化器,匹配返回结构
    首先定义一个对应返回结构的序列化器:

    from rest_framework import serializers
    
    class TagSumSerializer(serializers.Serializer):
        sum = serializers.FloatField(allow_null=True)
    

    然后在@action中指定该序列化器,返回结果时也用序列化器包装:

    @action(
        detail=False,
        methods=['get'],
        url_path='tagsum/(?P<account>[^/.]+)/(?P<tag>[^/.]+)',
        serializer_class=TagSumSerializer
    )
    def tagsum(self, request, account, tag):
        if not account or not tag:
            return Response({'status': "need account and tag"})
        sum_res =  Records.objects.filter(linkedaccount_id=account).filter(user_project=tag).aggregate(total=Sum('unblendedcost'))
        serializer = self.get_serializer({'sum': sum_res['total']})
        return Response(serializer.data)
    
  • 方案三:临时前端适配(不推荐)
    如果暂时不方便修改后端代码,可以把前端调用的路径从["records","tagsum"]改成["records","tagsum","read"]即可临时解决调用问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:57:03