在Django中重新订购对象的有效方法

发布于 2025-02-10 22:37:01 字数 932 浏览 0 评论 0原文

我已经编写了一个查询,以根据我在API请求中获得的值重新订购对象。 以下是我编写的示例代码:

    @action(detail=False, permission_classes=[], methods=["PUT"])
    def reorder_modules(self, request, *args, **kwargs):
        """
        ReOrdering Modules
        Sample request data
        {
            <module_id>: <ordering_number>
            12: 2,
            13: 1,
            14, 3,
        }
        """
        updatabale_modules = []
        for module_id, module_order in request.data.get("modules", {}).items():
            _mod = Module.objects.get(id=module_id)
            _mod.order = module_order
            updatabale_modules.append(_mod)
        Module.objects.bulk_update(updatabale_modules, ["order"])
        return Response({"detail": "successfully reordered course modules"}, status=HTTP_200_OK)

有什么方法可以避免循环和获取每个模块? 如果可能的话,我应该能够保存一些查询。

仅供参考,我正在使用MySQL数据库。

I have written a query to re-order objects based on the values I get in the API request.
Below is the sample code I have written:

    @action(detail=False, permission_classes=[], methods=["PUT"])
    def reorder_modules(self, request, *args, **kwargs):
        """
        ReOrdering Modules
        Sample request data
        {
            <module_id>: <ordering_number>
            12: 2,
            13: 1,
            14, 3,
        }
        """
        updatabale_modules = []
        for module_id, module_order in request.data.get("modules", {}).items():
            _mod = Module.objects.get(id=module_id)
            _mod.order = module_order
            updatabale_modules.append(_mod)
        Module.objects.bulk_update(updatabale_modules, ["order"])
        return Response({"detail": "successfully reordered course modules"}, status=HTTP_200_OK)

Is there any way to avoid looping and getting each module?
If that's possible I should be able to save making a few queries.

FYI, I'm using MySQL database.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

三生一梦 2025-02-17 22:37:01

代替直接查询module.objects.get(id = module_id),您可以实例化module对象使用:
模块(id = model_id),因此将您的方法重写为:

def reorder_modules(self, request, *args, **kwargs):
    updatabale_modules = []
    for module_id, module_order in request.data.get("modules", {}).items():
        _mod = Module(id=module_id)
        _mod.order = module_order
        updatabale_modules.append(_mod)
    Module.objects.bulk_update(updatabale_modules, ["order"])
    return Response({"detail": "successfully reordered course modules"}, status=HTTP_200_OK)

我使用Query Inspector调试此视图,它确实仅产生一个DB查询,并且可以与不存在的IDS一起使用

In stead of querying directly Module.objects.get(id=module_id), you can instantiate a Module object using:
Module(id=model_id), so that rewrite your method to:

def reorder_modules(self, request, *args, **kwargs):
    updatabale_modules = []
    for module_id, module_order in request.data.get("modules", {}).items():
        _mod = Module(id=module_id)
        _mod.order = module_order
        updatabale_modules.append(_mod)
    Module.objects.bulk_update(updatabale_modules, ["order"])
    return Response({"detail": "successfully reordered course modules"}, status=HTTP_200_OK)

I debugged this view with query inspector and it really produced only one db query, and it works with non-existent ids

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文