Эффективный способ переупорядочивания объектов в Django

Я написал запрос для переупорядочивания объектов на основе значений, полученных в запросе 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)

Есть ли способ избежать зацикливания и получения каждого модуля? Если это возможно, я смогу сэкономить на выполнении нескольких запросов.

Вместо прямого запроса Module.objects.get(id=module_id) вы можете инстанцировать объект Module, используя: 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)

Я отладил это представление с помощью инспектора запросов, и оно действительно производит только один запрос к базе данных, и он работает с несуществующими идентификаторами

Вернуться на верх