From 5ace600fb73bd39aaf168d67fab0dd7970028599 Mon Sep 17 00:00:00 2001
From: Erwan Rouchet <rouchet@teklia.com>
Date: Wed, 26 Jun 2024 16:13:01 +0000
Subject: [PATCH] Bump Django 4.2 and DRF 3.15.2

---
 .gitlab-ci.yml                                |  2 +-
 Dockerfile                                    |  4 +-
 arkindex/documents/migrations/0003_initial.py |  2 +-
 arkindex/documents/serializers/elements.py    |  6 +-
 .../tests/tasks/test_add_parent_selection.py  |  6 +-
 .../tests/test_bulk_transcription_entities.py | 10 +--
 .../tests/test_destroy_worker_results.py      |  2 +-
 arkindex/documents/tests/test_entities_api.py |  4 +-
 arkindex/documents/tests/test_entity_types.py |  2 +-
 arkindex/documents/tests/test_search_api.py   |  2 +-
 .../documents/tests/test_selection_api.py     |  4 +-
 .../documents/tests/test_transcriptions.py    |  4 +-
 arkindex/ponos/tests/test_api.py              |  8 +-
 .../tests/commands/test_cache_worker_runs.py  |  4 +-
 .../tests/test_process_dataset_sets.py        |  2 +-
 .../process/tests/test_process_elements.py    |  2 +-
 arkindex/process/tests/test_processes.py      | 16 ++--
 arkindex/process/tests/test_signals.py        |  2 +-
 arkindex/process/tests/test_workerruns.py     |  2 +-
 arkindex/process/tests/test_workers.py        | 18 ++---
 arkindex/process/utils.py                     | 13 +--
 arkindex/project/tests/test_argparse.py       |  4 +-
 arkindex/project/tools.py                     |  4 +-
 arkindex/sql_validation/add_first_parent.sql  | 10 +--
 arkindex/sql_validation/add_second_parent.sql |  8 +-
 .../element_move_with_children.sql            | 10 +--
 .../element_move_without_child.sql            | 10 +--
 .../sql_validation/element_trash_children.sql | 40 +++++-----
 .../sql_validation/element_trash_deep.sql     | 80 +++++++++----------
 .../sql_validation/element_trash_ml_class.sql | 20 ++---
 arkindex/sql_validation/indexer_prefetch.sql  |  2 +-
 .../process_elements_filter_type.sql          |  2 +-
 .../process_elements_top_level.sql            |  2 +-
 .../process_elements_with_image.sql           |  2 +-
 arkindex/sql_validation/remove_child.sql      |  2 +-
 .../remove_child_last_parent.sql              |  4 +-
 .../remove_children_multiple_parents.sql      |  4 +-
 .../remove_children_no_parents.sql            |  2 +-
 .../remove_children_single_parent.sql         |  2 +-
 .../worker_results_delete_all_versions.sql    | 20 ++---
 .../worker_results_delete_in_corpus.sql       | 20 ++---
 ...r_results_delete_under_parent_included.sql | 20 ++---
 ...elete_under_parent_included_worker_run.sql | 20 ++---
 arkindex/training/serializers.py              |  3 +
 .../training/tests/test_dataset_sets_api.py   | 22 ++---
 arkindex/training/tests/test_datasets_api.py  | 42 +++++-----
 arkindex/training/tests/test_model_api.py     | 10 +--
 .../tests/test_model_compatible_worker.py     | 42 +++++-----
 arkindex/users/api.py                         |  3 -
 arkindex/users/serializers.py                 | 16 +++-
 arkindex/users/tests/test_registration.py     |  6 +-
 base/requirements.txt                         |  2 +-
 requirements.txt                              |  2 +-
 tests-requirements.txt                        |  1 +
 54 files changed, 287 insertions(+), 265 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ca2ec5a629..c58015fa04 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -11,7 +11,7 @@ include:
 
 # For jobs that run backend scripts directly
 .backend-setup:
-  image: registry.gitlab.teklia.com/arkindex/backend/base:gitlab-teklia
+  image: registry.gitlab.teklia.com/arkindex/backend/base:django-4.2
 
   cache:
     paths:
diff --git a/Dockerfile b/Dockerfile
index 29185f9b0d..591f81dd54 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,11 +1,11 @@
 # syntax=docker/dockerfile:1
-FROM registry.gitlab.teklia.com/arkindex/backend/base:gitlab-teklia as build
+FROM registry.gitlab.teklia.com/arkindex/backend/base:django-4.2 as build
 
 RUN mkdir build
 ADD . build
 RUN cd build && python3 setup.py sdist
 
-FROM registry.gitlab.teklia.com/arkindex/backend/base:gitlab-teklia
+FROM registry.gitlab.teklia.com/arkindex/backend/base:django-4.2
 
 # Install arkindex and its deps
 # Uses a source archive instead of full local copy to speedup docker build
diff --git a/arkindex/documents/migrations/0003_initial.py b/arkindex/documents/migrations/0003_initial.py
index bae7596a20..7a59f33418 100644
--- a/arkindex/documents/migrations/0003_initial.py
+++ b/arkindex/documents/migrations/0003_initial.py
@@ -287,7 +287,7 @@ class Migration(migrations.Migration):
         ),
         migrations.AddConstraint(
             model_name="element",
-            constraint=models.CheckConstraint(check=models.Q(models.Q(("image_id", None), ("polygon", None)), models.Q(models.Q(("image_id", None), ("polygon", None), _connector="OR"), _negated=True), _connector="OR"), name="element_image_and_polygon"),
+            constraint=models.CheckConstraint(check=models.Q(models.Q(("image_id", None), ("polygon", None)), models.Q(("image_id", None), ("polygon", None), _connector="OR", _negated=True), _connector="OR"), name="element_image_and_polygon"),
         ),
         migrations.AddConstraint(
             model_name="element",
diff --git a/arkindex/documents/serializers/elements.py b/arkindex/documents/serializers/elements.py
index b7d70eb785..f1de6db990 100644
--- a/arkindex/documents/serializers/elements.py
+++ b/arkindex/documents/serializers/elements.py
@@ -883,9 +883,11 @@ class ElementTypeSerializer(ElementTypeLightSerializer):
     """
     corpus = serializers.PrimaryKeyRelatedField(queryset=Corpus.objects.none())
 
-    class Meta:
-        model = ElementType
+    class Meta(ElementTypeLightSerializer.Meta):
         fields = ElementTypeLightSerializer.Meta.fields + ("corpus", )
+        # Skip the default UniqueTogetherValidator that gets added because the serializer has both the corpus and slug,
+        # as we do our own validation in the ElementTypeLightSerializer.
+        validators = []
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
diff --git a/arkindex/documents/tests/tasks/test_add_parent_selection.py b/arkindex/documents/tests/tasks/test_add_parent_selection.py
index d4b500c735..85664b510a 100644
--- a/arkindex/documents/tests/tasks/test_add_parent_selection.py
+++ b/arkindex/documents/tests/tasks/test_add_parent_selection.py
@@ -47,17 +47,17 @@ class TestMoveSelection(FixtureTestCase):
             call(.5),
         ])
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             Element.objects.get_ascending(self.page1.id),
             [self.parent1, self.parent2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             Element.objects.get_ascending(self.page2.id),
             [self.parent1, self.parent2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             Element.objects.get_ascending(self.page3.id),
             [self.parent1],
             ordered=False,
diff --git a/arkindex/documents/tests/test_bulk_transcription_entities.py b/arkindex/documents/tests/test_bulk_transcription_entities.py
index fc6b747da3..9dddf4bde8 100644
--- a/arkindex/documents/tests/test_bulk_transcription_entities.py
+++ b/arkindex/documents/tests/test_bulk_transcription_entities.py
@@ -275,7 +275,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase):
         trancription using a WorkerRun of their own local process.
         """
         self.client.force_login(self.user)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.corpus.entities.values_list("name", "type", "worker_run_id").order_by("name", "type", "worker_run_id"),
             [("Paris", self.location_ent_type.id, None)],
         )
@@ -314,7 +314,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.corpus.entities.values_list("name", "type", "worker_run_id").order_by("name", "type", "worker_run_id"),
             [
                 ("Knight", self.person_ent_type.id, self.local_worker_run.id),
@@ -324,7 +324,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase):
             ],
         )
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.transcription.transcription_entities
             .values_list("entity__name", "entity__type", "offset", "length", "confidence", "worker_run_id")
             .order_by("entity__name", "offset"),
@@ -383,7 +383,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.transcription.transcription_entities.values_list(
                 "entity__name", "entity__type", "offset", "length", "confidence", "worker_run_id", "entity__worker_run_id"
             ),
@@ -418,7 +418,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.transcription.transcription_entities.values_list(
                 "entity__name", "entity__type", "offset", "length", "confidence", "worker_run_id", "entity__worker_run_id"
             ),
diff --git a/arkindex/documents/tests/test_destroy_worker_results.py b/arkindex/documents/tests/test_destroy_worker_results.py
index ee5b35614b..89eb4f5bac 100644
--- a/arkindex/documents/tests/test_destroy_worker_results.py
+++ b/arkindex/documents/tests/test_destroy_worker_results.py
@@ -61,7 +61,7 @@ class TestDestroyWorkerResults(FixtureAPITestCase):
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
         self.assertDictEqual(
             response.json(),
-            {"detail": "Not found."}
+            {"detail": "No Corpus matches the given query."}
         )
 
     @patch("arkindex.project.triggers.documents_tasks.worker_results_delete.delay")
diff --git a/arkindex/documents/tests/test_entities_api.py b/arkindex/documents/tests/test_entities_api.py
index 23c8985254..a949b6e74d 100644
--- a/arkindex/documents/tests/test_entities_api.py
+++ b/arkindex/documents/tests/test_entities_api.py
@@ -106,7 +106,9 @@ class TestEntitiesAPI(FixtureAPITestCase):
 
     @patch("arkindex.users.managers.BaseACLManager.filter_rights", return_value=Corpus.objects.none())
     def test_get_entity_elements_corpus_acl(self, filter_rights_mock):
-        with self.assertNumQueries(0):
+        # One query runs because Django >=4.2 no longer ignores unions that are known to be empty
+        # https://code.djangoproject.com/ticket/35559
+        with self.assertNumQueries(1):
             response = self.client.get(reverse("api:entity-elements", kwargs={"pk": str(self.entity.id)}))
             self.assertEqual(response.status_code, status.HTTP_200_OK)
 
diff --git a/arkindex/documents/tests/test_entity_types.py b/arkindex/documents/tests/test_entity_types.py
index 80522fc451..9348ee6dcc 100644
--- a/arkindex/documents/tests/test_entity_types.py
+++ b/arkindex/documents/tests/test_entity_types.py
@@ -365,7 +365,7 @@ class TestEntityTypesAPI(FixtureAPITestCase):
 
         self.assertDictEqual(
             response.json(),
-            {"detail": "Not found."}
+            {"detail": "No EntityType matches the given query."}
         )
 
         self.assertEqual(filter_rights_mock.call_count, 1)
diff --git a/arkindex/documents/tests/test_search_api.py b/arkindex/documents/tests/test_search_api.py
index 2fe56cd2fe..9aacaf4d34 100644
--- a/arkindex/documents/tests/test_search_api.py
+++ b/arkindex/documents/tests/test_search_api.py
@@ -68,7 +68,7 @@ class TestSearchApi(FixtureAPITestCase):
     def test_corpus_not_found(self):
         response = self.client.get(reverse("api:corpus-search", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"}))
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     @override_settings(ARKINDEX_FEATURES={"search": True})
     @patch("arkindex.project.mixins.has_access", return_value=False)
diff --git a/arkindex/documents/tests/test_selection_api.py b/arkindex/documents/tests/test_selection_api.py
index 36970acf11..d2fc1d7bda 100644
--- a/arkindex/documents/tests/test_selection_api.py
+++ b/arkindex/documents/tests/test_selection_api.py
@@ -252,7 +252,7 @@ class TestSelectionAPI(FixtureAPITestCase):
         with self.assertNumQueries(3):
             response = self.client.delete(reverse("api:elements-selection"), data={"corpus": bad_id})
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     def test_delete_selection_filter_corpus_not_an_uuid(self):
         bad_id = "melon"
@@ -362,7 +362,7 @@ class TestSelectionAPI(FixtureAPITestCase):
         with self.assertNumQueries(3):
             response = self.client.get(reverse("api:elements-selection"), data={"corpus": bad_id})
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     def test_list_selection_filter_corpus_not_an_uuid(self):
         self.user.selected_elements.add(self.page, self.vol)
diff --git a/arkindex/documents/tests/test_transcriptions.py b/arkindex/documents/tests/test_transcriptions.py
index 618f9aa9ee..f884be9df2 100644
--- a/arkindex/documents/tests/test_transcriptions.py
+++ b/arkindex/documents/tests/test_transcriptions.py
@@ -305,7 +305,9 @@ class TestTranscriptions(FixtureAPITestCase):
 
         self.client.force_login(self.user)
 
-        with self.assertNumQueries(4):
+        # There should be one less query, but Django >=4.2 no longer ignores unions that are known to be empty
+        # https://code.djangoproject.com/ticket/35559
+        with self.assertNumQueries(5):
             response = self.client.get(
                 reverse("api:element-transcriptions", kwargs={"pk": str(self.page.id)}),
                 data={
diff --git a/arkindex/ponos/tests/test_api.py b/arkindex/ponos/tests/test_api.py
index d7663b63f4..5b9b3914fe 100644
--- a/arkindex/ponos/tests/test_api.py
+++ b/arkindex/ponos/tests/test_api.py
@@ -846,10 +846,10 @@ class TestAPI(FixtureAPITestCase):
                 "requires_gpu": True,
             },
         )
-        self.assertQuerysetEqual(self.task2.children.all(), Task.objects.none())
+        self.assertQuerySetEqual(self.task2.children.all(), Task.objects.none())
         self.task2.refresh_from_db()
         self.assertEqual(self.task2.slug, f"{task_2_slug}_old2")
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             restarted_task.children.all(),
             Task.objects.filter(id__in=[self.task3.id, task4.id]),
         )
@@ -912,10 +912,10 @@ class TestAPI(FixtureAPITestCase):
                 "requires_gpu": False,
             },
         )
-        self.assertQuerysetEqual(self.task2.children.all(), Task.objects.none())
+        self.assertQuerySetEqual(self.task2.children.all(), Task.objects.none())
         self.task2.refresh_from_db()
         self.assertEqual(self.task2.slug, f"{task_2_slug}_old1")
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             restarted_task.children.all(),
             Task.objects.filter(id__in=[self.task3.id, task4.id]),
         )
diff --git a/arkindex/process/tests/commands/test_cache_worker_runs.py b/arkindex/process/tests/commands/test_cache_worker_runs.py
index 6d9e2ee6a2..b8f6c60f3e 100644
--- a/arkindex/process/tests/commands/test_cache_worker_runs.py
+++ b/arkindex/process/tests/commands/test_cache_worker_runs.py
@@ -47,13 +47,13 @@ class TestCacheWorkerRuns(FixtureTestCase):
         )
 
     def test_run(self):
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             WorkerRun.objects.order_by("summary").values_list("id", "has_results"),
             [(self.run_1.id, False), (self.run_2.id, False), (self.run_3.id, True), (self.run_4.id, True), (self.run_5.id, False)]
         )
         with self.assertNumQueries(2):
             call_command("cache_worker_runs")
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             WorkerRun.objects.order_by("summary").values_list("id", "has_results"),
             [(self.run_1.id, False), (self.run_2.id, True), (self.run_3.id, False), (self.run_4.id, True), (self.run_5.id, False)]
         )
diff --git a/arkindex/process/tests/test_process_dataset_sets.py b/arkindex/process/tests/test_process_dataset_sets.py
index f314f3e1a0..373dc6dc0a 100644
--- a/arkindex/process/tests/test_process_dataset_sets.py
+++ b/arkindex/process/tests/test_process_dataset_sets.py
@@ -293,7 +293,7 @@ class TestProcessDatasetSets(FixtureAPITestCase):
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
         self.assertEqual(ProcessDatasetSet.objects.count(), 10)
         self.assertTrue(ProcessDatasetSet.objects.filter(process=self.dataset_process.id, set=test_set.id).exists())
-        self.assertQuerysetEqual(self.dataset_process.sets.order_by("dataset__name", "name"), [
+        self.assertQuerySetEqual(self.dataset_process.sets.order_by("dataset__name", "name"), [
             *self.private_dataset.sets.order_by("name"),
             *self.dataset1.sets.order_by("name"),
             test_set,
diff --git a/arkindex/process/tests/test_process_elements.py b/arkindex/process/tests/test_process_elements.py
index ddb62ef3d3..dc69c9734f 100644
--- a/arkindex/process/tests/test_process_elements.py
+++ b/arkindex/process/tests/test_process_elements.py
@@ -574,7 +574,7 @@ class TestProcessElements(FixtureAPITestCase):
         with self.assertNumQueries(3):
             response = self.client.get(reverse("api:process-elements-list", kwargs={"pk": process.id}))
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Process matches the given query."})
 
     def test_workers_mode(self):
         # The Workers mode returns some elements
diff --git a/arkindex/process/tests/test_processes.py b/arkindex/process/tests/test_processes.py
index 802e11c757..5033161fac 100644
--- a/arkindex/process/tests/test_processes.py
+++ b/arkindex/process/tests/test_processes.py
@@ -1755,7 +1755,7 @@ class TestProcesses(FixtureAPITestCase):
         process.refresh_from_db()
         self.assertEqual(process.state, State.Unscheduled)
         self.assertIsNone(process.finished)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             process.tasks.filter(run=1).values_list("slug", flat=True),
             ["import_files"],
         )
@@ -1791,7 +1791,7 @@ class TestProcesses(FixtureAPITestCase):
         process.refresh_from_db()
         self.assertEqual(process.state, State.Unscheduled)
         self.assertIsNone(process.finished)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             process.tasks.filter(run=1).values_list("slug", flat=True),
             ["import_s3"],
         )
@@ -1898,7 +1898,7 @@ class TestProcesses(FixtureAPITestCase):
         data = response.json()
         process = Process.objects.get(id=data["id"])
         self.assertEqual(process.mode, ProcessMode.Files)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             process.files.all(), [
                 self.img_df,
                 self.pdf_df,
@@ -2063,7 +2063,7 @@ class TestProcesses(FixtureAPITestCase):
             reverse("api:process-start", kwargs={"pk": "12341234-1234-1234-1234-123412341234"})
         )
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Process matches the given query."})
 
     def test_start_process_wrong_process_mode(self):
         self.assertFalse(self.user_img_process.mode in (ProcessMode.Workers, ProcessMode.Dataset))
@@ -2375,7 +2375,7 @@ class TestProcesses(FixtureAPITestCase):
         self.assertEqual(process2.tasks.count(), 1)
         task = process2.tasks.get()
         self.assertEqual(task.slug, run.task_slug)
-        self.assertQuerysetEqual(process2.sets.order_by("dataset__name"), [
+        self.assertQuerySetEqual(process2.sets.order_by("dataset__name"), [
             test_set_2, test_set_1
         ])
 
@@ -2685,8 +2685,8 @@ class TestProcesses(FixtureAPITestCase):
         task_1 = process.tasks.get(slug=run_1.task_slug)
         task_2 = process.tasks.get(slug=run_2.task_slug)
 
-        self.assertQuerysetEqual(task_1.parents.all(), [init_task])
-        self.assertQuerysetEqual(task_2.parents.all(), [task_1])
+        self.assertQuerySetEqual(task_1.parents.all(), [init_task])
+        self.assertQuerySetEqual(task_2.parents.all(), [task_1])
 
     @override_settings(PONOS_DEFAULT_ENV={"ARKINDEX_API_TOKEN": "testToken"})
     @override_settings(ARKINDEX_TASKS_IMAGE="registry.teklia.com/tasks")
@@ -3137,7 +3137,7 @@ class TestProcesses(FixtureAPITestCase):
             "activity_state": "disabled",
             "use_cache": False
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             Process.objects.get(id=new_id).elements.all(),
             [volume],
         )
diff --git a/arkindex/process/tests/test_signals.py b/arkindex/process/tests/test_signals.py
index 3719074bad..ecc6f86160 100644
--- a/arkindex/process/tests/test_signals.py
+++ b/arkindex/process/tests/test_signals.py
@@ -248,7 +248,7 @@ class TestSignals(FixtureAPITestCase):
         )
 
         self.assertEqual(len(self.process_1.worker_runs.all()), 2)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.process_1.worker_runs.all(),
             [self.run_1, run_2],
             ordered=False,
diff --git a/arkindex/process/tests/test_workerruns.py b/arkindex/process/tests/test_workerruns.py
index efd8b2a4e1..a69e3b1ed4 100644
--- a/arkindex/process/tests/test_workerruns.py
+++ b/arkindex/process/tests/test_workerruns.py
@@ -328,7 +328,7 @@ class TestWorkerRuns(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Process matches the given query."})
 
     def test_create_invalid_process_mode(self):
         self.client.force_login(self.user)
diff --git a/arkindex/process/tests/test_workers.py b/arkindex/process/tests/test_workers.py
index 3ca0775144..ac749492b8 100644
--- a/arkindex/process/tests/test_workers.py
+++ b/arkindex/process/tests/test_workers.py
@@ -546,7 +546,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             response = self.client.get(reverse("api:worker-retrieve", kwargs={"pk": str(self.worker_reco.id)}))
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Worker matches the given query."})
 
         self.assertListEqual(filter_rights_mock.call_args_list, [
             call(self.user, Worker, Role.Contributor.value),
@@ -605,7 +605,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
         worker = Worker.objects.get(id=data["id"])
         self.assertEqual(worker.type, self.worker_type_dla)
         self.assertIsNone(worker.repository)
-        self.assertQuerysetEqual(worker.memberships.values_list("user_id", "level"), [
+        self.assertQuerySetEqual(worker.memberships.values_list("user_id", "level"), [
             (self.user.id, Role.Admin.value)
         ])
         self.assertDictEqual(data, {
@@ -639,7 +639,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
 
         self.assertFalse(WorkerType.objects.filter(slug="new_type").exists())
-        self.assertQuerysetEqual(self.worker_custom.memberships.values_list("user_id", "level"), [
+        self.assertQuerySetEqual(self.worker_custom.memberships.values_list("user_id", "level"), [
             (self.user.id, Role.Guest.value)
         ])
         self.assertDictEqual(response.json(), {"slug": ["You cannot use this value."]})
@@ -758,7 +758,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Worker matches the given query."})
         self.assertListEqual(filter_rights_mock.call_args_list, [
             call(self.user, Worker, Role.Contributor.value),
             call(self.user, Repository, Role.Contributor.value),
@@ -990,7 +990,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertEqual(response.json(), {"detail": "No Worker matches the given query."})
 
         self.assertListEqual(filter_rights_mock.call_args_list, [
             call(self.user, Worker, Role.Contributor.value),
@@ -1007,7 +1007,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             Repository.objects.none(),
         ]
 
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.patch(
                 reverse("api:worker-retrieve", kwargs={"pk": str(self.worker_reco.id)}),
                 {
@@ -1143,7 +1143,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
                 self.worker_reco.archived = current_value
                 self.worker_reco.save()
 
-                with self.assertNumQueries(5):
+                with self.assertNumQueries(4):
                     response = self.client.patch(
                         reverse("api:worker-retrieve", kwargs={"pk": str(self.worker_reco.id)}),
                         {
@@ -1333,7 +1333,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Worker matches the given query."})
 
     def test_create_version_available_requires_docker_image(self):
         with self.assertNumQueries(4):
@@ -2467,7 +2467,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase):
             response = self.client.get(reverse("api:corpus-versions", kwargs={"pk": self.corpus.id}))
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     def test_corpus_worker_version_not_verified(self):
         self.user.verified_email = False
diff --git a/arkindex/process/utils.py b/arkindex/process/utils.py
index ef58ba9c33..95a03e4c36 100644
--- a/arkindex/process/utils.py
+++ b/arkindex/process/utils.py
@@ -2,8 +2,8 @@ import json
 from hashlib import md5
 
 from django.conf import settings
-from django.db.models import CharField, Value
-from django.db.models.functions import Cast, Concat, NullIf
+from django.db.models import ExpressionWrapper, F, TextField, Value
+from django.db.models.functions import Concat, NullIf
 from django.utils.module_loading import import_string
 
 from arkindex.project.tools import RTrimChr
@@ -27,11 +27,12 @@ def annotate_image_url(field="image"):
     so we strip any trailing slashes and add our own.
     This uses NullIf as this concatenation will return '/' if there is no zone on the element.
     """
+    slash = Value("/", output_field=TextField())
     return NullIf(
         Concat(
-            RTrimChr(f"{field}__server__url", Value("/")),
-            Value("/"),
-            Cast(f"{field}__path", CharField()),
+            RTrimChr(f"{field}__server__url", slash),
+            slash,
+            ExpressionWrapper(F(f"{field}__path"), output_field=TextField()),
         ),
-        Value("/"),
+        slash,
     )
diff --git a/arkindex/project/tests/test_argparse.py b/arkindex/project/tests/test_argparse.py
index afeaeaf25f..b4b40ee64d 100644
--- a/arkindex/project/tests/test_argparse.py
+++ b/arkindex/project/tests/test_argparse.py
@@ -26,7 +26,7 @@ class TestArgparseHelpers(FixtureTestCase):
     def test_corpus_argument_many(self):
         arg = CorpusArgument(many=True)
         result = arg("tests")
-        self.assertQuerysetEqual(result, [self.corpus, ])
+        self.assertQuerySetEqual(result, [self.corpus, ])
 
     def test_corpus_argument_not_found(self):
         arg = CorpusArgument()
@@ -61,7 +61,7 @@ class TestArgparseHelpers(FixtureTestCase):
     def test_element_argument_many(self):
         arg = ElementArgument(type__folder=True, many=True)
         result = arg("volume 1")
-        self.assertQuerysetEqual(result, [self.vol, ])
+        self.assertQuerySetEqual(result, [self.vol, ])
 
     def test_element_argument_multiple(self):
         arg = ElementArgument()
diff --git a/arkindex/project/tools.py b/arkindex/project/tools.py
index ab448463f8..989e1aeb96 100644
--- a/arkindex/project/tools.py
+++ b/arkindex/project/tools.py
@@ -2,7 +2,7 @@ from collections.abc import Iterable, Iterator, Sized
 from datetime import datetime, timezone
 from urllib.parse import urlparse
 
-from django.db.models import Aggregate, CharField, Func
+from django.db.models import Aggregate, Func, TextField
 from django.db.models.expressions import BaseExpression, OrderByList
 from django.urls import reverse
 
@@ -151,7 +151,7 @@ class RTrimChr(Func):
     """
     function = "RTRIM"
     arity = 2
-    output_field = CharField()
+    output_field = TextField()
 
 
 class OrderedSetAggregate(Aggregate):
diff --git a/arkindex/sql_validation/add_first_parent.sql b/arkindex/sql_validation/add_first_parent.sql
index 94369ab03b..755f1b3fba 100644
--- a/arkindex/sql_validation/add_first_parent.sql
+++ b/arkindex/sql_validation/add_first_parent.sql
@@ -18,10 +18,10 @@ SELECT EXISTS
      LIMIT 1), EXISTS
     (SELECT 1
      FROM child_paths
-     WHERE path @ > ARRAY['{A}'::uuid]), EXISTS
+     WHERE path @> ARRAY['{A}'::uuid]), EXISTS
     (SELECT 1
      FROM parent_paths
-     WHERE path @ > ARRAY['{B}'::uuid]),
+     WHERE path @> ARRAY['{B}'::uuid]),
     (SELECT COUNT(*)
      FROM parent_paths),
     (SELECT path
@@ -29,7 +29,7 @@ SELECT EXISTS
      LIMIT 1),
     (SELECT COALESCE(MAX(ordering) + 1, 0)
      FROM documents_elementpath
-     WHERE path @ > ARRAY['{A}'::uuid]
+     WHERE path @> ARRAY['{A}'::uuid]
 	AND path[array_length(path, 1)] = '{A}'::uuid ) ;
 
 INSERT INTO documents_elementpath (id, element_id, path, ordering)
@@ -45,7 +45,7 @@ UPDATE "documents_elementpath"
 SET "path" = ARRAY['{first_parent}'::uuid,
                    '{A}'::uuid]::uuid[], "ordering" = 1
 WHERE ("documents_elementpath"."element_id" = '{B}'::uuid
-       AND "documents_elementpath"."path" = (ARRAY[])::uuid[]);
+       AND "documents_elementpath"."path" = '{{}}'::uuid[]);
 
 UPDATE "documents_elementpath"
 SET "path" = array_cat(ARRAY['{first_parent}'::uuid, '{A}'::uuid], "documents_elementpath"."path")::uuid[]
@@ -58,7 +58,7 @@ SELECT uuid_generate_v4(),
        child_paths.ordering
 FROM documents_elementpath child_paths,
      documents_elementpath new_parent_paths
-WHERE child_paths.path @ > ARRAY['{first_parent}'::uuid,
+WHERE child_paths.path @> ARRAY['{first_parent}'::uuid,
                                  '{A}'::uuid,
                                  '{B}'::uuid]
     AND new_parent_paths.element_id = '{A}'::uuid
diff --git a/arkindex/sql_validation/add_second_parent.sql b/arkindex/sql_validation/add_second_parent.sql
index ba4374ad9b..0d8691022a 100644
--- a/arkindex/sql_validation/add_second_parent.sql
+++ b/arkindex/sql_validation/add_second_parent.sql
@@ -18,10 +18,10 @@ SELECT EXISTS
      LIMIT 1), EXISTS
     (SELECT 1
      FROM child_paths
-     WHERE path @ > ARRAY['{A}'::uuid]), EXISTS
+     WHERE path @> ARRAY['{A}'::uuid]), EXISTS
     (SELECT 1
      FROM parent_paths
-     WHERE path @ > ARRAY['{B}'::uuid]),
+     WHERE path @> ARRAY['{B}'::uuid]),
     (SELECT COUNT(*)
      FROM parent_paths),
     (SELECT path
@@ -29,7 +29,7 @@ SELECT EXISTS
      LIMIT 1),
     (SELECT COALESCE(MAX(ordering) + 1, 0)
      FROM documents_elementpath
-     WHERE path @ > ARRAY['{A}'::uuid]
+     WHERE path @> ARRAY['{A}'::uuid]
 	AND path[array_length(path, 1)] = '{A}'::uuid ) ;
 
 INSERT INTO documents_elementpath (id, element_id, path, ordering)
@@ -47,7 +47,7 @@ SELECT uuid_generate_v4(),
        child_paths.ordering
 FROM documents_elementpath child_paths,
      documents_elementpath new_parent_paths
-WHERE child_paths.path @ > ARRAY['{K}'::uuid,
+WHERE child_paths.path @> ARRAY['{K}'::uuid,
                                  '{B}'::uuid]
     AND new_parent_paths.element_id = '{A}'::uuid ;
 
diff --git a/arkindex/sql_validation/element_move_with_children.sql b/arkindex/sql_validation/element_move_with_children.sql
index 5bd41790a3..354e208d60 100644
--- a/arkindex/sql_validation/element_move_with_children.sql
+++ b/arkindex/sql_validation/element_move_with_children.sql
@@ -21,7 +21,7 @@ WHERE element_id = '{source_id}'::uuid ;
 
 UPDATE documents_elementpath
 SET path = path[2:]
-WHERE path @ > ARRAY['{parent_id}'::uuid,
+WHERE path @> ARRAY['{parent_id}'::uuid,
                      '{source_id}'::uuid]
     AND path[0:2] = ARRAY['{parent_id}'::uuid,
                           '{source_id}'::uuid] ;
@@ -53,10 +53,10 @@ SELECT EXISTS
      LIMIT 1), EXISTS
     (SELECT 1
      FROM child_paths
-     WHERE path @ > ARRAY['{destination_id}'::uuid]), EXISTS
+     WHERE path @> ARRAY['{destination_id}'::uuid]), EXISTS
     (SELECT 1
      FROM parent_paths
-     WHERE path @ > ARRAY['{source_id}'::uuid]),
+     WHERE path @> ARRAY['{source_id}'::uuid]),
     (SELECT COUNT(*)
      FROM parent_paths),
     (SELECT path
@@ -64,13 +64,13 @@ SELECT EXISTS
      LIMIT 1),
     (SELECT COALESCE(MAX(ordering) + 1, 0)
      FROM documents_elementpath
-     WHERE path @ > ARRAY['{destination_id}'::uuid]
+     WHERE path @> ARRAY['{destination_id}'::uuid]
        AND path[array_length(path, 1)] = '{destination_id}'::uuid ) ;
 
 UPDATE "documents_elementpath"
 SET "path" = ARRAY['{destination_id}'::uuid]::uuid[], "ordering" = 3
 WHERE ("documents_elementpath"."element_id" = '{source_id}'::uuid
-       AND "documents_elementpath"."path" = (ARRAY[])::uuid[]);
+       AND "documents_elementpath"."path" = '{{}}'::uuid[]);
 
 UPDATE "documents_elementpath"
 SET "path" = array_cat(ARRAY['{destination_id}'::uuid], "documents_elementpath"."path")::uuid[]
diff --git a/arkindex/sql_validation/element_move_without_child.sql b/arkindex/sql_validation/element_move_without_child.sql
index 5bd41790a3..354e208d60 100644
--- a/arkindex/sql_validation/element_move_without_child.sql
+++ b/arkindex/sql_validation/element_move_without_child.sql
@@ -21,7 +21,7 @@ WHERE element_id = '{source_id}'::uuid ;
 
 UPDATE documents_elementpath
 SET path = path[2:]
-WHERE path @ > ARRAY['{parent_id}'::uuid,
+WHERE path @> ARRAY['{parent_id}'::uuid,
                      '{source_id}'::uuid]
     AND path[0:2] = ARRAY['{parent_id}'::uuid,
                           '{source_id}'::uuid] ;
@@ -53,10 +53,10 @@ SELECT EXISTS
      LIMIT 1), EXISTS
     (SELECT 1
      FROM child_paths
-     WHERE path @ > ARRAY['{destination_id}'::uuid]), EXISTS
+     WHERE path @> ARRAY['{destination_id}'::uuid]), EXISTS
     (SELECT 1
      FROM parent_paths
-     WHERE path @ > ARRAY['{source_id}'::uuid]),
+     WHERE path @> ARRAY['{source_id}'::uuid]),
     (SELECT COUNT(*)
      FROM parent_paths),
     (SELECT path
@@ -64,13 +64,13 @@ SELECT EXISTS
      LIMIT 1),
     (SELECT COALESCE(MAX(ordering) + 1, 0)
      FROM documents_elementpath
-     WHERE path @ > ARRAY['{destination_id}'::uuid]
+     WHERE path @> ARRAY['{destination_id}'::uuid]
        AND path[array_length(path, 1)] = '{destination_id}'::uuid ) ;
 
 UPDATE "documents_elementpath"
 SET "path" = ARRAY['{destination_id}'::uuid]::uuid[], "ordering" = 3
 WHERE ("documents_elementpath"."element_id" = '{source_id}'::uuid
-       AND "documents_elementpath"."path" = (ARRAY[])::uuid[]);
+       AND "documents_elementpath"."path" = '{{}}'::uuid[]);
 
 UPDATE "documents_elementpath"
 SET "path" = array_cat(ARRAY['{destination_id}'::uuid], "documents_elementpath"."path")::uuid[]
diff --git a/arkindex/sql_validation/element_trash_children.sql b/arkindex/sql_validation/element_trash_children.sql
index 0ad34d8158..180543969b 100644
--- a/arkindex/sql_validation/element_trash_children.sql
+++ b/arkindex/sql_validation/element_trash_children.sql
@@ -18,7 +18,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -29,7 +29,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -40,7 +40,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -51,7 +51,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -62,7 +62,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -73,7 +73,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -84,7 +84,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -95,7 +95,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -107,7 +107,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -118,7 +118,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
@@ -133,7 +133,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[1] IN
+                  WHERE (V1."path")[1] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -144,7 +144,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -155,7 +155,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -166,7 +166,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -177,7 +177,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -188,7 +188,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -199,7 +199,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -210,7 +210,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -222,7 +222,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[1] IN
+              WHERE ("documents_elementpath"."path")[1] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -233,7 +233,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[1] IN
+WHERE ("documents_elementpath"."path")[1] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
diff --git a/arkindex/sql_validation/element_trash_deep.sql b/arkindex/sql_validation/element_trash_deep.sql
index b63124f7c2..7372e92cfe 100644
--- a/arkindex/sql_validation/element_trash_deep.sql
+++ b/arkindex/sql_validation/element_trash_deep.sql
@@ -18,7 +18,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[4] IN
+                  WHERE (V1."path")[4] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -29,7 +29,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -40,7 +40,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -51,7 +51,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -62,7 +62,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -73,7 +73,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -84,7 +84,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -95,7 +95,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[4] IN
+         WHERE (V1."path")[4] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -107,7 +107,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[4] IN
+              WHERE ("documents_elementpath"."path")[4] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -118,7 +118,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[4] IN
+WHERE ("documents_elementpath"."path")[4] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
@@ -133,7 +133,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[3] IN
+                  WHERE (V1."path")[3] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -144,7 +144,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -155,7 +155,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -166,7 +166,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -177,7 +177,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -188,7 +188,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -199,7 +199,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -210,7 +210,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[3] IN
+         WHERE (V1."path")[3] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -222,7 +222,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[3] IN
+              WHERE ("documents_elementpath"."path")[3] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -233,7 +233,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[3] IN
+WHERE ("documents_elementpath"."path")[3] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
@@ -248,7 +248,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -259,7 +259,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -270,7 +270,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -281,7 +281,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -292,7 +292,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -303,7 +303,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -314,7 +314,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -325,7 +325,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -337,7 +337,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -348,7 +348,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
@@ -363,7 +363,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[1] IN
+                  WHERE (V1."path")[1] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE U0."id" = '{id}'::uuid)));
@@ -374,7 +374,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -385,7 +385,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -396,7 +396,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -407,7 +407,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -418,7 +418,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -429,7 +429,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -440,7 +440,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[1] IN
+         WHERE (V1."path")[1] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE U0."id" = '{id}'::uuid));
@@ -452,7 +452,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[1] IN
+              WHERE ("documents_elementpath"."path")[1] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE U0."id" = '{id}'::uuid)) RETURNING element_id)
@@ -463,7 +463,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[1] IN
+WHERE ("documents_elementpath"."path")[1] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE U0."id" = '{id}'::uuid);
diff --git a/arkindex/sql_validation/element_trash_ml_class.sql b/arkindex/sql_validation/element_trash_ml_class.sql
index f8d7261585..3a3158045e 100644
--- a/arkindex/sql_validation/element_trash_ml_class.sql
+++ b/arkindex/sql_validation/element_trash_ml_class.sql
@@ -19,7 +19,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -31,7 +31,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -43,7 +43,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -55,7 +55,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -67,7 +67,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -79,7 +79,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -91,7 +91,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -103,7 +103,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -116,7 +116,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
@@ -128,7 +128,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id")
diff --git a/arkindex/sql_validation/indexer_prefetch.sql b/arkindex/sql_validation/indexer_prefetch.sql
index 2777d0d4ef..65f43b8174 100644
--- a/arkindex/sql_validation/indexer_prefetch.sql
+++ b/arkindex/sql_validation/indexer_prefetch.sql
@@ -42,7 +42,7 @@ FROM
      FROM parent
      LIMIT 10000
      OFFSET 0) AS parent_chunk
-INNER JOIN documents_elementpath as elementpath ON (elementpath.path @ > ARRAY[parent_chunk.id])
+INNER JOIN documents_elementpath as elementpath ON (elementpath.path @> ARRAY[parent_chunk.id])
 INNER JOIN documents_element as element ON (elementpath.element_id = element.id)
 INNER JOIN documents_elementtype elementtype ON (element.type_id = elementtype.id) ;
 
diff --git a/arkindex/sql_validation/process_elements_filter_type.sql b/arkindex/sql_validation/process_elements_filter_type.sql
index 6710d5e0f8..a9a497c321 100644
--- a/arkindex/sql_validation/process_elements_filter_type.sql
+++ b/arkindex/sql_validation/process_elements_filter_type.sql
@@ -65,7 +65,7 @@ SELECT "documents_element"."id",
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
 WHERE ("documents_element"."corpus_id" = '{corpus_id}'::uuid
-       AND "documents_elementpath"."path" = (ARRAY[])::uuid[]
+       AND "documents_elementpath"."path" = '{{}}'::uuid[]
        AND "documents_element"."corpus_id" = '{corpus_id}'::uuid
        AND "documents_element"."type_id" = '{type_id}'::uuid)
 ORDER BY "documents_element"."id" ASC
diff --git a/arkindex/sql_validation/process_elements_top_level.sql b/arkindex/sql_validation/process_elements_top_level.sql
index 3087532fd0..03c040152c 100644
--- a/arkindex/sql_validation/process_elements_top_level.sql
+++ b/arkindex/sql_validation/process_elements_top_level.sql
@@ -65,7 +65,7 @@ SELECT "documents_element"."id",
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
 WHERE ("documents_element"."corpus_id" = '{corpus_id}'::uuid
-       AND "documents_elementpath"."path" = (ARRAY[])::uuid[]
+       AND "documents_elementpath"."path" = '{{}}'::uuid[]
        AND "documents_element"."corpus_id" = '{corpus_id}'::uuid)
 ORDER BY "documents_element"."id" ASC
 LIMIT 21
diff --git a/arkindex/sql_validation/process_elements_with_image.sql b/arkindex/sql_validation/process_elements_with_image.sql
index 9d89dc7c0e..7a689853ec 100644
--- a/arkindex/sql_validation/process_elements_with_image.sql
+++ b/arkindex/sql_validation/process_elements_with_image.sql
@@ -68,7 +68,7 @@ SELECT "documents_element"."id",
        "documents_element"."polygon"::bytea,
        "documents_element"."rotation_angle",
        "documents_element"."mirrored",
-       NULLIF(CONCAT(RTRIM("images_imageserver"."url", '/'), CONCAT('/', ("images_image"."path")::varchar)), '/') AS "image_url"
+       NULLIF(CONCAT((RTRIM("images_imageserver"."url", '/'))::text, (CONCAT(('/')::text, ("images_image"."path")::text))::text), '/') AS "image_url"
 FROM "documents_element"
 LEFT OUTER JOIN "images_image" ON ("documents_element"."image_id" = "images_image"."id")
 LEFT OUTER JOIN "images_imageserver" ON ("images_image"."server_id" = "images_imageserver"."id")
diff --git a/arkindex/sql_validation/remove_child.sql b/arkindex/sql_validation/remove_child.sql
index 0ec747fdad..a757299fb8 100644
--- a/arkindex/sql_validation/remove_child.sql
+++ b/arkindex/sql_validation/remove_child.sql
@@ -16,7 +16,7 @@ DELETE
 FROM documents_elementpath child_paths USING documents_elementpath old_parent_paths
 WHERE old_parent_paths.element_id = '{B}'::uuid
     AND old_parent_paths.path[array_length(old_parent_paths.path, 1)] = '{A}'::uuid
-    AND child_paths.path @ > (old_parent_paths.path || '{B}'::uuid) ;
+    AND child_paths.path @> (old_parent_paths.path || '{B}'::uuid) ;
 
 DELETE
 FROM "documents_elementpath"
diff --git a/arkindex/sql_validation/remove_child_last_parent.sql b/arkindex/sql_validation/remove_child_last_parent.sql
index 9dd30683ac..fa81733d12 100644
--- a/arkindex/sql_validation/remove_child_last_parent.sql
+++ b/arkindex/sql_validation/remove_child_last_parent.sql
@@ -14,7 +14,7 @@ WHERE element_id = '{B}'::uuid ;
 
 UPDATE documents_elementpath
 SET path = path[3:]
-WHERE path @ > ARRAY['{first_parent}'::uuid,
+WHERE path @> ARRAY['{first_parent}'::uuid,
                      '{A}'::uuid,
                      '{B}'::uuid]
     AND path[0:3] = ARRAY['{first_parent}'::uuid,
@@ -31,7 +31,7 @@ DELETE
 FROM documents_elementpath child_paths USING documents_elementpath old_parent_paths
 WHERE old_parent_paths.element_id = '{B}'::uuid
     AND old_parent_paths.path[array_length(old_parent_paths.path, 1)] = '{A}'::uuid
-    AND child_paths.path @ > (old_parent_paths.path || '{B}'::uuid) ;
+    AND child_paths.path @> (old_parent_paths.path || '{B}'::uuid) ;
 
 DELETE
 FROM "documents_elementpath"
diff --git a/arkindex/sql_validation/remove_children_multiple_parents.sql b/arkindex/sql_validation/remove_children_multiple_parents.sql
index d5670523cb..c1565c51de 100644
--- a/arkindex/sql_validation/remove_children_multiple_parents.sql
+++ b/arkindex/sql_validation/remove_children_multiple_parents.sql
@@ -11,7 +11,7 @@ DELETE
 FROM documents_elementpath child_paths USING documents_elementpath parent_paths
 WHERE parent_paths.element_id = '{A}'::uuid
     AND parent_paths.path <> ARRAY['{first_parent}'::uuid]
-    AND child_paths.path @ > (parent_paths.path || '{A}'::uuid) ;
+    AND child_paths.path @> (parent_paths.path || '{A}'::uuid) ;
 
 DELETE
 FROM documents_elementpath parent_paths USING documents_elementpath other_paths
@@ -21,7 +21,7 @@ WHERE parent_paths.path && ARRAY['{A}'::uuid]
 
 UPDATE documents_elementpath
 SET path = path[2 + 1:]
-WHERE path @ > ARRAY['{first_parent}'::uuid,
+WHERE path @> ARRAY['{first_parent}'::uuid,
                      '{A}'::uuid]
     AND path[:2] = ARRAY['{first_parent}'::uuid,
                          '{A}'::uuid] ;
diff --git a/arkindex/sql_validation/remove_children_no_parents.sql b/arkindex/sql_validation/remove_children_no_parents.sql
index 4d31a5ff82..dba5386430 100644
--- a/arkindex/sql_validation/remove_children_no_parents.sql
+++ b/arkindex/sql_validation/remove_children_no_parents.sql
@@ -15,7 +15,7 @@ WHERE parent_paths.path && ARRAY['{A}'::uuid]
 
 UPDATE documents_elementpath
 SET path = path[1 + 1:]
-WHERE path @ > ARRAY['{A}'::uuid]
+WHERE path @> ARRAY['{A}'::uuid]
     AND path[:1] = ARRAY['{A}'::uuid] ;
 
 RELEASE SAVEPOINT "{savepoint}"
diff --git a/arkindex/sql_validation/remove_children_single_parent.sql b/arkindex/sql_validation/remove_children_single_parent.sql
index c05f2af5da..7d86e0d019 100644
--- a/arkindex/sql_validation/remove_children_single_parent.sql
+++ b/arkindex/sql_validation/remove_children_single_parent.sql
@@ -15,7 +15,7 @@ WHERE parent_paths.path && ARRAY['{A}'::uuid]
 
 UPDATE documents_elementpath
 SET path = path[2 + 1:]
-WHERE path @ > ARRAY['{X}'::uuid,
+WHERE path @> ARRAY['{X}'::uuid,
                      '{A}'::uuid]
     AND path[:2] = ARRAY['{X}'::uuid,
                          '{A}'::uuid] ;
diff --git a/arkindex/sql_validation/worker_results_delete_all_versions.sql b/arkindex/sql_validation/worker_results_delete_all_versions.sql
index b0fe051fd7..afbb1ee13b 100644
--- a/arkindex/sql_validation/worker_results_delete_all_versions.sql
+++ b/arkindex/sql_validation/worker_results_delete_all_versions.sql
@@ -19,7 +19,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -31,7 +31,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -43,7 +43,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -55,7 +55,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -67,7 +67,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -79,7 +79,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -91,7 +91,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -103,7 +103,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -116,7 +116,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -128,7 +128,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE (U0."corpus_id" = '{corpus_id}'::uuid
diff --git a/arkindex/sql_validation/worker_results_delete_in_corpus.sql b/arkindex/sql_validation/worker_results_delete_in_corpus.sql
index 1f7a8878f0..3f7e788120 100644
--- a/arkindex/sql_validation/worker_results_delete_in_corpus.sql
+++ b/arkindex/sql_validation/worker_results_delete_in_corpus.sql
@@ -19,7 +19,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -31,7 +31,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -43,7 +43,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -55,7 +55,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -67,7 +67,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -79,7 +79,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -91,7 +91,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -103,7 +103,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -116,7 +116,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -128,7 +128,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE (U0."corpus_id" = '{corpus_id}'::uuid
diff --git a/arkindex/sql_validation/worker_results_delete_under_parent_included.sql b/arkindex/sql_validation/worker_results_delete_under_parent_included.sql
index 91623264d4..522be37240 100644
--- a/arkindex/sql_validation/worker_results_delete_under_parent_included.sql
+++ b/arkindex/sql_validation/worker_results_delete_under_parent_included.sql
@@ -208,7 +208,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -221,7 +221,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -234,7 +234,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -247,7 +247,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -260,7 +260,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -273,7 +273,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -286,7 +286,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -299,7 +299,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -313,7 +313,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -326,7 +326,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE (U0."corpus_id" = '{corpus_id}'::uuid
diff --git a/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql b/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql
index eec3d75ca8..073cd3dc98 100644
--- a/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql
+++ b/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql
@@ -197,7 +197,7 @@ WHERE "documents_transcriptionentity"."id" IN
                  (SELECT V0."id"
                   FROM "documents_element" V0
                   INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-                  WHERE V1."path"[2] IN
+                  WHERE (V1."path")[2] IN
                           (SELECT U0."id"
                            FROM "documents_element" U0
                            WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -210,7 +210,7 @@ WHERE "documents_transcription"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -223,7 +223,7 @@ WHERE "process_workeractivity"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -236,7 +236,7 @@ WHERE "documents_metadata"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -249,7 +249,7 @@ WHERE "documents_classification"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -262,7 +262,7 @@ WHERE "documents_selection"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -275,7 +275,7 @@ WHERE "process_processelement"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -288,7 +288,7 @@ WHERE "process_process"."element_id" IN
         (SELECT V0."id"
          FROM "documents_element" V0
          INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id")
-         WHERE V1."path"[2] IN
+         WHERE (V1."path")[2] IN
                  (SELECT U0."id"
                   FROM "documents_element" U0
                   WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -302,7 +302,7 @@ WITH element_ids (id) AS
              (SELECT "documents_element"."id"
               FROM "documents_element"
               INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-              WHERE "documents_elementpath"."path"[2] IN
+              WHERE ("documents_elementpath"."path")[2] IN
                       (SELECT U0."id"
                        FROM "documents_element" U0
                        WHERE (U0."corpus_id" = '{corpus_id}'::uuid
@@ -315,7 +315,7 @@ WHERE element.id = element_ids.id ;
 SELECT "documents_element"."id"
 FROM "documents_element"
 INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id")
-WHERE "documents_elementpath"."path"[2] IN
+WHERE ("documents_elementpath"."path")[2] IN
         (SELECT U0."id"
          FROM "documents_element" U0
          WHERE (U0."corpus_id" = '{corpus_id}'::uuid
diff --git a/arkindex/training/serializers.py b/arkindex/training/serializers.py
index 9cd60e6a34..96b73b3e13 100644
--- a/arkindex/training/serializers.py
+++ b/arkindex/training/serializers.py
@@ -565,6 +565,9 @@ class DatasetSetSerializer(serializers.ModelSerializer):
         model = DatasetSet
         fields = ("id", "name", "dataset", )
         read_only_fields = ("id", )
+        # Remove the DRF-provided unique validator, which causes extra queries.
+        # We do our own unique validation using the already prefetched sets on the dataset.
+        validators = []
 
     def validate_name(self, name):
         if any(ds.name == name for ds in self.context["dataset"].sets.all()):
diff --git a/arkindex/training/tests/test_dataset_sets_api.py b/arkindex/training/tests/test_dataset_sets_api.py
index d5c3f630ef..cafedafb83 100644
--- a/arkindex/training/tests/test_dataset_sets_api.py
+++ b/arkindex/training/tests/test_dataset_sets_api.py
@@ -66,7 +66,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     @patch("arkindex.users.managers.BaseACLManager.filter_rights")
     def test_create_no_read_access(self, filter_rights_mock):
@@ -79,7 +79,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
         self.assertEqual(filter_rights_mock.call_count, 1)
         self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value))
@@ -183,7 +183,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_update_set_doesnt_exist(self):
         self.client.force_login(self.user)
@@ -194,7 +194,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetSet matches the given query."})
 
     @patch("arkindex.users.managers.BaseACLManager.filter_rights")
     def test_update_no_read_access(self, filter_rights_mock):
@@ -207,7 +207,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
         self.assertEqual(filter_rights_mock.call_count, 1)
         self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value))
@@ -312,7 +312,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_partial_update_set_doesnt_exist(self):
         self.client.force_login(self.user)
@@ -323,7 +323,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetSet matches the given query."})
 
     @patch("arkindex.users.managers.BaseACLManager.filter_rights")
     def test_partial_update_no_read_access(self, filter_rights_mock):
@@ -336,7 +336,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
         self.assertEqual(filter_rights_mock.call_count, 1)
         self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value))
@@ -438,7 +438,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_destroy_set_doesnt_exist(self):
         self.client.force_login(self.user)
@@ -448,7 +448,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetSet matches the given query."})
 
     @patch("arkindex.users.managers.BaseACLManager.filter_rights")
     def test_destroy_no_read_access(self, filter_rights_mock):
@@ -460,7 +460,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
         self.assertEqual(filter_rights_mock.call_count, 1)
         self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value))
diff --git a/arkindex/training/tests/test_datasets_api.py b/arkindex/training/tests/test_datasets_api.py
index 1bb2a5aa91..5fab4af070 100644
--- a/arkindex/training/tests/test_datasets_api.py
+++ b/arkindex/training/tests/test_datasets_api.py
@@ -63,7 +63,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
         with self.assertNumQueries(3):
             response = self.client.get(reverse("api:corpus-datasets", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"}))
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     @patch("arkindex.project.mixins.has_access", return_value=False)
     def test_list_private_corpus(self, has_access_mock):
@@ -158,7 +158,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Corpus matches the given query."})
 
     @patch("arkindex.project.mixins.has_access", return_value=False)
     def test_create_private_corpus(self, has_access_mock):
@@ -490,7 +490,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_update_name_too_long(self):
         self.client.force_login(self.user)
@@ -822,7 +822,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_partial_update(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.patch(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={"description": "Omedeto!", "unique_elements": False},
@@ -870,7 +870,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_partial_update_requires_ponos_auth(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.patch(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -884,7 +884,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
         })
 
     def test_partial_update_ponos_task_state_update(self):
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.patch(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
@@ -899,7 +899,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_partial_update_ponos_task_state_requires_dataset_in_process(self):
         self.process.process_sets.all().delete()
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.patch(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
@@ -1022,7 +1022,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
         self.assertEqual(filter_rights_mock.call_count, 1)
         self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value))
@@ -1034,7 +1034,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 reverse("api:dataset-update", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"})
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_retrieve(self):
         self.client.force_login(self.user)
@@ -1115,7 +1115,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 reverse("api:dataset-update", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"}),
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."})
 
     def test_delete_dataset_in_process_forbidden(self):
         self.client.force_login(self.user)
@@ -1568,7 +1568,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json",
             )
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             train_set.set_elements.values_list("set__name", "element__name").order_by("element__name"),
             [("train", "Volume 1, page 1r")]
         )
@@ -1601,7 +1601,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json",
             )
             self.assertEqual(response.status_code, status.HTTP_201_CREATED)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             (
                 DatasetElement.objects
                 .filter(set__dataset=self.dataset)
@@ -1724,7 +1724,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
     def test_add_from_selection(self):
         train_set = self.dataset.sets.get(name="train")
         train_set.set_elements.create(element=self.page1)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             train_set.set_elements.values_list("set__name", "element__name").order_by("element__name"),
             [("train", "Volume 1, page 1r")]
         )
@@ -1738,7 +1738,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json",
             )
             self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             train_set.set_elements.values_list("set__name", "element__name").order_by("element__name"),
             [
                 ("train", "Volume 1"),
@@ -1780,7 +1780,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 format="json",
             )
             self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             (
                 DatasetElement.objects
                 .filter(set__dataset=self.dataset)
@@ -2268,7 +2268,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 "id": str(dev_clone.id)
             }
         ])
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             DatasetElement.objects.filter(set__dataset_id=clone.id).values_list("set__name", "element__name").order_by("element__name", "set__name"),
             [
                 ("dev", "Volume 1"),
@@ -2427,7 +2427,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 + "?set=train"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."})
 
     def test_destroy_dataset_element_set_doesnt_exist(self):
         self.client.force_login(self.user)
@@ -2438,7 +2438,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 + "?set=match"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."})
 
     def test_destroy_dataset_element_element_doesnt_exist(self):
         self.client.force_login(self.user)
@@ -2449,7 +2449,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 + "?set=train"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."})
 
     def test_destroy_dataset_element_element_not_in_dataset(self):
         train_set = self.dataset.sets.get(name="train")
@@ -2462,7 +2462,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 + "?set=train"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."})
 
     def test_destroy_dataset_element_wrong_set(self):
         dev_set, _, train_set = self.dataset.sets.all().order_by("name")
@@ -2476,7 +2476,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                 + "?set=train"
             )
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."})
 
     def test_destroy_dataset_element(self):
         self.client.force_login(self.user)
diff --git a/arkindex/training/tests/test_model_api.py b/arkindex/training/tests/test_model_api.py
index 93038de206..6a7fce4921 100644
--- a/arkindex/training/tests/test_model_api.py
+++ b/arkindex/training/tests/test_model_api.py
@@ -353,7 +353,7 @@ class TestModelAPI(FixtureAPITestCase):
         with self.assertNumQueries(1):
             response = self.client.get(reverse("api:model-version-download", kwargs={"pk": uuid4()}), {"token": "hehe_perhaps"})
         self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
-        self.assertDictEqual(response.json(), {"detail": "Not found."})
+        self.assertDictEqual(response.json(), {"detail": "No ModelVersion matches the given query."})
 
     def test_download_model_version_non_available(self):
         """
@@ -1301,7 +1301,7 @@ class TestModelAPI(FixtureAPITestCase):
         self.model_version3.parent = self.model_version2
         self.model_version3.save()
 
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.patch(
                 reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}),
                 {"parent": None},
@@ -1332,7 +1332,7 @@ class TestModelAPI(FixtureAPITestCase):
         s3_presigned_url.return_value = "http://s3/get_url"
         self.client.force_login(self.user2)
 
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.patch(
                 reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}),
                 # self.model_version3 is a version of self.model2, while self.model_version1 belongs to self.model1
@@ -1393,7 +1393,7 @@ class TestModelAPI(FixtureAPITestCase):
         self.client.force_login(self.user2)
         current_hash = self.model_version3.hash
 
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.patch(
                 reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}),
                 {"hash": self.model_version4.hash},
@@ -1463,7 +1463,7 @@ class TestModelAPI(FixtureAPITestCase):
         current_hash = self.model_version3.hash
 
         self.client.force_login(self.user1)
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.patch(
                 reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}),
                 {"archive_hash": "d" * 32, "hash": "e" * 32, "size": 32},
diff --git a/arkindex/training/tests/test_model_compatible_worker.py b/arkindex/training/tests/test_model_compatible_worker.py
index 20a19ff5b7..a1d06e321d 100644
--- a/arkindex/training/tests/test_model_compatible_worker.py
+++ b/arkindex/training/tests/test_model_compatible_worker.py
@@ -190,12 +190,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             "model": str(self.model1.id),
             "worker": str(self.worker2.id),
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1, self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -220,12 +220,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             "model": str(self.model1.id),
             "worker": str(self.worker2.id),
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1, self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -248,12 +248,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             "model": str(self.model1.id),
             "worker": str(self.worker2.id),
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1, self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -275,12 +275,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
         self.assertEqual(response.json(), {
             "worker": ["This worker is already marked as compatible with this model."],
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1, self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -303,12 +303,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
         self.assertEqual(response.json(), {
             "model": ["This model is archived."],
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -473,12 +473,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -500,12 +500,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -525,12 +525,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             )
             self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
 
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -549,14 +549,14 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
             self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
         self.assertEqual(response.json(), {
-            "detail": "Not found.",
+            "detail": "No Model_compatible_workers matches the given query.",
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
@@ -580,12 +580,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase):
         self.assertEqual(response.json(), {
             "model": ["This model is archived."],
         })
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model1.compatible_workers.all(),
             [self.worker1, self.worker2],
             ordered=False,
         )
-        self.assertQuerysetEqual(
+        self.assertQuerySetEqual(
             self.model2.compatible_workers.all(),
             [self.worker2],
             ordered=False,
diff --git a/arkindex/users/api.py b/arkindex/users/api.py
index 6769b89633..51789957e2 100644
--- a/arkindex/users/api.py
+++ b/arkindex/users/api.py
@@ -88,9 +88,6 @@ class UserCreate(CreateAPIView):
         serializer = self.get_serializer(data=request.data)
         serializer.is_valid(raise_exception=True)
 
-        if User.objects.filter(email=serializer.validated_data["email"]).exists():
-            raise ValidationError({"email": ["An user with this email address already exists."]})
-
         user = serializer.save()
         login(self.request, user)
 
diff --git a/arkindex/users/serializers.py b/arkindex/users/serializers.py
index c8060116ea..41ccf7d98b 100644
--- a/arkindex/users/serializers.py
+++ b/arkindex/users/serializers.py
@@ -7,6 +7,7 @@ from django.db import transaction
 from django.utils.http import urlsafe_base64_decode
 from drf_spectacular.utils import extend_schema_field, inline_serializer
 from rest_framework import serializers
+from rest_framework.validators import UniqueValidator
 
 from arkindex.documents.models import Corpus
 from arkindex.users.models import Group, Role, Scope, User, UserScope
@@ -99,6 +100,17 @@ class NewUserSerializer(serializers.ModelSerializer):
             "email",
             "password"
         )
+        extra_kwargs = {
+            "email": {
+                "validators": [
+                    # DRF automatically adds this validator, but we override it to change the error message
+                    UniqueValidator(
+                        queryset=User.objects.all(),
+                        message="A user with this email address already exists.",
+                    )
+                ]
+            },
+        }
 
     def validate(self, data):
         data = super().validate(data)
@@ -195,7 +207,9 @@ class UserEmailVerificationSerializer(UserSerializer):
             "is_admin",
             "auth_token",
         )
-        extra_kwargs = {}
+        extra_kwargs = {
+            "email": {"validators": []}
+        }
 
     def validate(self, data):
         error_msg = "There is no user with this email or the token is invalid."
diff --git a/arkindex/users/tests/test_registration.py b/arkindex/users/tests/test_registration.py
index 393d8724cf..17de7a3a79 100644
--- a/arkindex/users/tests/test_registration.py
+++ b/arkindex/users/tests/test_registration.py
@@ -407,9 +407,9 @@ class TestRegistration(FixtureAPITestCase):
             format="json",
         )
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-        self.assertDictEqual(response.json(), {"email": ["An user with this email address already exists."]})
+        self.assertDictEqual(response.json(), {"email": ["A user with this email address already exists."]})
 
-        # Asserts that the check is insensitive on the email field
+    def test_register_existing_user_ignore_case(self):
         email = "eMaIL@adDreSs.cOm"
         self.assertTrue(User.objects.filter(email=email).exists())
         response = self.client.post(
@@ -418,7 +418,7 @@ class TestRegistration(FixtureAPITestCase):
             format="json",
         )
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-        self.assertDictEqual(response.json(), {"email": ["An user with this email address already exists."]})
+        self.assertDictEqual(response.json(), {"email": ["A user with this email address already exists."]})
 
     def test_send_validation_email_requires_auth(self):
         response = self.client.post(reverse("api:send-verification-email"))
diff --git a/base/requirements.txt b/base/requirements.txt
index 45e9e466e9..7d69933625 100644
--- a/base/requirements.txt
+++ b/base/requirements.txt
@@ -1,6 +1,6 @@
 boto3==1.18.13
 cryptography==3.4.7
-Django==4.1.7
+Django==4.2.13
 ed25519==1.5
 lxml==4.9.2
 psycopg2-binary==2.9.1
diff --git a/requirements.txt b/requirements.txt
index afa3b928e3..ae31e0fe6f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,7 +7,7 @@ django-cors-headers==3.14.0
 django-enumfields==2.1.1
 django-pgtrigger==4.7.0
 django-rq==2.10.1
-djangorestframework==3.14.0
+djangorestframework==3.15.2
 djangorestframework-simplejwt==5.2.2
 docker==7.0.0
 drf-spectacular==0.27.2
diff --git a/tests-requirements.txt b/tests-requirements.txt
index a3d8fb5d32..a2566e1498 100644
--- a/tests-requirements.txt
+++ b/tests-requirements.txt
@@ -1,5 +1,6 @@
 coverage==7.2.3
 moto==4.1.8
 responses==0.23.1
+sqlparse==0.5.0
 tripoli==2.0.0
 unittest-xml-reporting==3.2.0
-- 
GitLab