我使用序列化程序、 View 集和路由器创建了一个 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 中)
有没有更好的方法,比如直接调用 View 集类并从那里获取数据?
非常感谢!
最佳答案
在同一个应用程序中调用 API 端点不是一个好的做法。
一个选项是直接调用您的 View 集方法,如 https://stackoverflow.com/a/51149806/290036
我推荐的另一种方法是为您的 API 和 View 使用相同的代码库。
def get_avaialble_items():
items = Item.objects.filter(available=True)
...
return items
# Use get_avaialble_items both in ItemViewSet and ProductListView
关于python - Django - 在views.py内部使用我自己的REST API的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60529072/