Django Rest Framework Copeapi LinkLookupError
Я получаю LinkLookupError
при попытке получить конечную точку, обслуживаемую Django Rest Framework. Эта ошибка возникает только после одного успешного запроса. Мой DRF view.py
выглядит следующим образом:
class RecordViewSet(viewsets.ReadOnlyModelViewSet):
"""
API endpoint that allows Records to be viewed or edited.
"""
filter_backends = (SimpleRecordFilterBackend,)
serializer_class = RecordSerializer
permission_classes = (IsAuthenticated,)
@action(detail=False, url_path='tagsum/(?P<account>[^/.]+)/(?P<tag>[^/.]+)')
def tagsum(self, request, account, tag):
if not account or not tag:
return Response({'status': "need accoutn and tag"})
sum = Records.objects.filter(linkedaccount_id=account).filter(user_project=tag).aggregate(total=Sum('unblendedcost'))
return Response({'sum': sum['total']})
def get_queryset(self):
q = Q()
linkedaccount_id = self.request.query_params.get("linkedaccount_id") or ''
user_project = self.request.query_params.get("user_project") or ''
if linkedaccount_id:
q &= Q(linkedaccount_id=linkedaccount_id)
if user_project:
q &= Q(user_project=user_project)
return Records.objects.filter(q).annotate(Sum('unblendedcost'))
После модификации файла представления я вызываю $coreapi get http://localhost:8000/api/docs/
и вижу:
...
records: {
list([page], [linkedaccount_id], [productname], [user_project])
tagsum(account, tag)
read(id, [linkedaccount_id], [productname], [user_project])
}
...
и после загрузки одной страницы, которая вызывает эту конечную точку, когда я запускаю ту же команду, я вижу такой вывод:
...
records: {
tagsum: {
read(account, tag)
}
list([page], [linkedaccount_id], [productname], [user_project])
read(id, [linkedaccount_id], [productname], [user_project])
}
...
Обратите внимание, что метод tagsum теперь имеет вложенный метод read. Вызовы к конечной точке теперь возвращают следующую ошибку.
errors.js:10 Uncaught LinkLookupError: Invalid link lookup: ["records","tagsum"]
at new LinkLookupError (errors.js:10)
at lookupLink (client.js:19)
at Client.action (client.js:38)
at eval (ProjectTagBilling.js:40)
at invokePassiveEffectCreate (react-dom.development.js:23482)
at HTMLUnknownElement.callCallback (react-dom.development.js:3945)
at Object.invokeGuardedCallbackDev (react-dom.development.js:3994)
at invokeGuardedCallback (react-dom.development.js:4056)
at flushPassiveEffectsImpl (react-dom.development.js:23569)
at unstable_runWithPriority (scheduler.development.js:468)
Любой совет будет принят с благодарностью.
Обходной путь, используйте fetch. 😞
HTML
<script>
const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
</script>
JS
useEffect(() => {
setIsLoading(true)
fetch(`/api/records/tagsum/${'432399220289'}/${props.tag}/`, {
headers: {'X-CSRFToken': csrftoken},
mehtod: 'GET'
}).then(response => response.json()).then(result => {
setIsLoading(false)
setSum(result.sum)
})
},[])