|
1 | 1 | from django.db.backends.base.schema import BaseDatabaseSchemaEditor
|
2 | 2 | from django.db.models import Index, UniqueConstraint
|
| 3 | +from django.db.models.expressions import F, OrderBy |
3 | 4 | from pymongo.operations import SearchIndexModel
|
4 | 5 |
|
5 | 6 | from django_mongodb_backend.indexes import SearchIndex
|
@@ -345,6 +346,36 @@ def _remove_field_index(self, model, field, column_prefix=""):
|
345 | 346 | )
|
346 | 347 | collection.drop_index(index_names[0])
|
347 | 348 |
|
| 349 | + def _check_supported_expressions(self, expressions): |
| 350 | + for expression in expressions: |
| 351 | + expression = expression.expression if isinstance(expression, OrderBy) else expression |
| 352 | + if not isinstance(expression, F): |
| 353 | + return False |
| 354 | + return True |
| 355 | + |
| 356 | + def _unique_supported( |
| 357 | + self, |
| 358 | + condition=None, |
| 359 | + deferrable=None, |
| 360 | + include=None, |
| 361 | + expressions=None, |
| 362 | + nulls_distinct=None, |
| 363 | + ): |
| 364 | + return ( |
| 365 | + (not condition or self.connection.features.supports_partial_indexes) |
| 366 | + and (not deferrable or self.connection.features.supports_deferrable_unique_constraints) |
| 367 | + and (not include or self.connection.features.supports_covering_indexes) |
| 368 | + and ( |
| 369 | + not expressions |
| 370 | + or self._check_supported_expressions(expressions) |
| 371 | + or self.connection.features.supports_expression_indexes |
| 372 | + ) |
| 373 | + and ( |
| 374 | + nulls_distinct is None |
| 375 | + or self.connection.features.supports_nulls_distinct_unique_constraints |
| 376 | + ) |
| 377 | + ) |
| 378 | + |
348 | 379 | @ignore_embedded_models
|
349 | 380 | def add_constraint(self, model, constraint, field=None, column_prefix="", parent_model=None):
|
350 | 381 | if isinstance(constraint, UniqueConstraint) and self._unique_supported(
|
@@ -386,6 +417,7 @@ def remove_constraint(self, model, constraint):
|
386 | 417 | nulls_distinct=constraint.nulls_distinct,
|
387 | 418 | ):
|
388 | 419 | idx = Index(
|
| 420 | + *constraint.expressions, |
389 | 421 | fields=constraint.fields,
|
390 | 422 | name=constraint.name,
|
391 | 423 | condition=constraint.condition,
|
|
0 commit comments