开发者社区> 问答> 正文

Django-在views.py内部使用我自己的REST API的正确方法?

我使用序列化器,视图集和路由器创建了Django REST API。我的终点看起来像这样:

http://www.website.com/api/items
http://www.website.com/api/items/available

serializer.py(省略导入)

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = '__all__'

viewsets.py(省略导入)

class ItemViewSet(viewsets.ModelViewSet):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer

    @action(methods=['GET'], detail=False)
    def most_expensive(self, request):
        query = self.get_queryset().order_by('price').last()
        serialized = self.serializer_class(query)
        return Response(serialized.data)

现在,我希望能够从我的views.py访问此API,以使用可用项呈现HTML:这是我现在正在这样做的方式:

views.py(省略导入)

class ProductListView(View):
    template = 'store/product_list.html'

    def get(self, request):
        items = requests.get('http://127.0.0.1:8000/api/items/available')
        context = {'items': items}
        return render(request, self.template, context=context)

使用请求模块时,我有一些担忧,在测量之后,我注意到该请求要经历0.015秒的延迟,并且如果我更改了API端点,则由于其硬编码而不得不在这里进行调整。

我可以使用以下方式获取商品:

Item.objects.filter(available=True)

这几乎立即给了我结果,但是我写了两次所有查询(一次在我的API中,一次在我的views.py中)

有没有更好的方法来做到这一点,例如直接调用viewset类并从那里获取数据?

非常感谢!

问题来源:stackoverflow

展开
收起
is大龙 2020-03-25 00:29:48 2844 0
1 条回答
写回答
取消 提交回答
  • 在同一应用程序中调用API端点不被认为是一种好习惯。

    一种选择是直接调用您的viewset方法,例如 https://stackoverflow.com/a/51149806/290036

    我推荐的另一种方法是对您的API和视图使用相同的代码库。

    def get_avaialble_items():
         items = Item.objects.filter(available=True)
         ...
         return items
    
    # Use get_avaialble_items both in ItemViewSet and ProductListView
    

    回答来源:stackoverflow

    2020-03-25 00:29:57
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Boot2.0实战Redis分布式缓存 立即下载
CUDA MATH API 立即下载
API PLAYBOOK 立即下载