繁体   English   中英

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

[英]Django - Correct method of consuming my own REST API internally in the views.py?

我使用序列化程序、视图集和路由器创建了一个 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 中)

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

非常感谢!

在同一个应用程序中调用 API 端点不被认为是一种好的做法。

一种选择是直接调用您的视图集方法,如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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM