|
9 | 9 | from django.db import DataError
|
10 | 10 | from django.db.backends.base.operations import BaseDatabaseOperations
|
11 | 11 | from django.db.models import TextField
|
12 |
| -from django.db.models.expressions import Combinable |
| 12 | +from django.db.models.expressions import Combinable, Expression |
13 | 13 | from django.db.models.functions import Cast
|
14 | 14 | from django.utils import timezone
|
15 | 15 | from django.utils.regex_helper import _lazy_re_compile
|
@@ -77,10 +77,26 @@ def adapt_timefield_value(self, value):
|
77 | 77 | raise ValueError("MongoDB backend does not support timezone-aware times.")
|
78 | 78 | return datetime.datetime.combine(datetime.datetime.min.date(), value)
|
79 | 79 |
|
| 80 | + def _get_arrayfield_converter(self, converter, *args, **kwargs): |
| 81 | + # Return a database converter that can be applied to a list of values. |
| 82 | + def convert_value(value, expression, connection): |
| 83 | + return [converter(x, expression, connection) for x in value] |
| 84 | + |
| 85 | + return convert_value |
| 86 | + |
80 | 87 | def get_db_converters(self, expression):
|
81 | 88 | converters = super().get_db_converters(expression)
|
82 | 89 | internal_type = expression.output_field.get_internal_type()
|
83 |
| - if internal_type == "DateField": |
| 90 | + if internal_type == "ArrayField": |
| 91 | + converters.extend( |
| 92 | + [ |
| 93 | + self._get_arrayfield_converter(converter) |
| 94 | + for converter in self.get_db_converters( |
| 95 | + Expression(output_field=expression.output_field.base_field) |
| 96 | + ) |
| 97 | + ] |
| 98 | + ) |
| 99 | + elif internal_type == "DateField": |
84 | 100 | converters.append(self.convert_datefield_value)
|
85 | 101 | elif internal_type == "DateTimeField":
|
86 | 102 | if settings.USE_TZ:
|
|
0 commit comments