![](/img/trans.png)
[英]sphinx is showing the django base views instead of my own views.py
[英]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.