我使用序列化器,视图集和路由器创建了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
在同一应用程序中调用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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。