【问题标题】:Django APIView: how to display calculated valueDjango APIView:如何显示计算值
【发布时间】:2023-01-06 22:09:08
【问题描述】:

我必须在 APIVIEW 中显示计算值,但我不知道如何设置视图,它给我一个错误。

返回简单 JSON 的代码工作正常:

def protein_coverage(request, protein_id):
    try:
        proteins = Protein.objects.filter(protein=protein_id)
        domain_length = 0
    
        coverage = domain_length / protein_length
        

    except Protein.DoesNotExist:
        return HttpResponse({'message': 'This Protein does not exist'}, status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':

        serializer = ProteinCoverageSerializer(coverage)
        return JsonResponse(serializer.data,safe=False)

我为 APIView 尝试了这个:

class ProteinCoverage(generics.RetrieveAPIView):
    serializer_class = ProteinCoverageSerializer

    def get_queryset(self):
        pk = self.kwargs['protein_id']
        proteins = Protein.objects.filter(protein=pk)
        domain_length = 0
    
        coverage = domain_length / protein_length
        return coverage

但它给了我一个错误:

Expected view ProteinCoverage to be called with a URL keyword argument named "pk". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.

我不确定,哪种 API 适合这种情况以及如何将单个变量传递给它。

documentation我也查了,但不清楚。 如何将此 JsonResponse 转换为 APIView?

【问题讨论】:

  • 覆盖率看起来像一个浮点数,而不是一个查询集。
  • 这是一个浮动,是的。这就是问题所在。我如何使用 APIView 显示它?

标签: json django api


【解决方案1】:

你可以简单地用APIView来做:

from rest_framework.response import Response
from rest_framework.views import APIView

class ProteinCoverageView(APIView):

    def get(self, request, protein_id):
        try:
            proteins = Protein.objects.filter(protein=protein_id)
            domain_length = 0
        
            coverage = domain_length / protein_length
        
        except Protein.DoesNotExist:
            return Response({'message': 'This Protein does not exist'}, status=status.HTTP_404_NOT_FOUND)
        
        
        serializer = ProteinCoverageSerializer(coverage)
        return Response(serializer.data)

【讨论】:

  • 完美,非常感谢,ruddra!
【解决方案2】:

你必须使用lookup_fields。参考docs

【讨论】:

    【解决方案3】:

    这是使用 restframewok 的 APIView 的等效解决方案。

    from rest_framework.response import Response
    from rest_framework import status
    from rest_framework.views import APIView
    
    class ProteinCoverageView(APIView):
        def get(self, request, protein_id):
            try:
                proteins = Protein.objects.get(protein=protein_id) # using get() not filter as get() raise exception if no data found.
                domain_length = 0
                coverage = domain_length / protein_length
            except Protein.DoesNotExist:
                return Response({'message': 'This Protein does not exist'}, status=status.HTTP_404_NOT_FOUND)
    
            serializer = ProteinCoverageSerializer(coverage)
            return Response(serializer.data)
    

    【讨论】:

    • 感谢您调查此事,Mubashar。问题是我的 id 是一个字符串 <str:protein_id>,所以 url 看起来像这样:path('apiView/coverage/<str:protein_id>', api.ProteinCoverage.as_view(), name='ProteinCoverage' ),这对 JsonResponse 来说工作正常。这对 APIView 来说是不可能的吗?
    • @midsummer 查看更新后的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2022-07-12
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多