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

标签 python django python-3.x

我使用序列化程序、 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/

相关文章:

python - 通过它们在 python 中的接近度来聚类值(机器学习?)

python - 将 3 字节立体声 WAV 文件转换为 numpy 数组

django - S3 托管/查询字符串身份验证因额外参数而中断

Python:将小于(<)运算符与 `and` 关键字结合起来?

python - Python 模块是否需要 shebang 或编码指令?

sql - Django ORM 在注释多个聚合列时删除不需要的组

python - 需要 Django python 帮助

python - 如何在 10 秒后强制用户输入

python - Python 3.6+ 中是否有格式化的字节字符串文字?

python - 无法导入包 - "ImportError: No module named _mechanize"