Skip to content

Commit bd8605e

Browse files
committed
Add an error message for fields that don't support queries
1 parent 71a611d commit bd8605e

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

django_mongodb_backend/fields/encryption.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ def deconstruct(self):
3232
return name, path, args, kwargs
3333

3434

35+
class NoQueriesMixin:
36+
def __init__(self, *args, **kwargs):
37+
if "queries" in kwargs:
38+
raise ValueError(f"{self.__class__.__name__} does not support the queries argument.")
39+
super().__init__(*args, **kwargs)
40+
41+
3542
# Django fields
3643
class EncryptedBinaryField(EncryptedFieldMixin, models.BinaryField):
3744
pass
@@ -114,15 +121,17 @@ class EncryptedUUIDField(EncryptedFieldMixin, models.UUIDField):
114121

115122

116123
# MongoDB fields
117-
class EncryptedArrayField(EncryptedFieldMixin, ArrayField):
124+
class EncryptedArrayField(NoQueriesMixin, EncryptedFieldMixin, ArrayField):
118125
pass
119126

120127

121-
class EncryptedEmbeddedModelArrayField(EncryptedFieldMixin, EmbeddedModelArrayField):
128+
class EncryptedEmbeddedModelArrayField(
129+
NoQueriesMixin, EncryptedFieldMixin, EmbeddedModelArrayField
130+
):
122131
pass
123132

124133

125-
class EncryptedEmbeddedModelField(EncryptedFieldMixin, EmbeddedModelField):
134+
class EncryptedEmbeddedModelField(NoQueriesMixin, EncryptedFieldMixin, EmbeddedModelField):
126135
pass
127136

128137

docs/ref/models/encrypted-fields.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ for use with Queryable Encryption.
7272
| ``EncryptedObjectIdField`` | :class:`~.fields.ObjectIdField` |
7373
+----------------------------------------+------------------------------------------------------+
7474

75+
These fields don't support the ``queries`` argument::
76+
- ``EncryptedArrayField``
77+
- ``EncryptedEmbeddedModelArrayField``
78+
- ``EncryptedEmbeddedModelField``
79+
7580
The following fields are supported by Django MongoDB Backend but not supported
7681
by Queryable Encryption.
7782

tests/encryption_/test_fields.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@
44

55
from bson import ObjectId
66

7-
from django_mongodb_backend.fields import EncryptedCharField, EncryptedIntegerField
7+
from django_mongodb_backend.fields import (
8+
EncryptedArrayField,
9+
EncryptedCharField,
10+
EncryptedEmbeddedModelArrayField,
11+
EncryptedEmbeddedModelField,
12+
EncryptedIntegerField,
13+
)
814

915
from .models import (
1016
Actor,
@@ -249,3 +255,15 @@ def test_deconstruct_preserves_queries_and_rewrites_path(self):
249255
self.assertEqual(new_field.queries, field.queries)
250256
self.assertIsNot(new_field, field)
251257
self.assertEqual(new_field.max_length, field.max_length)
258+
259+
def test_fields_without_queries(self):
260+
"""Some field types (array, object) can't be queried."""
261+
for field in (
262+
EncryptedArrayField,
263+
EncryptedEmbeddedModelField,
264+
EncryptedEmbeddedModelArrayField,
265+
):
266+
with self.subTest(field=field):
267+
msg = f"{field.__name__} does not support the queries argument."
268+
with self.assertRaisesMessage(ValueError, msg):
269+
field(Actor, queries={})

0 commit comments

Comments
 (0)