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

