|
1 | | -from collections import defaultdict |
2 | | - |
3 | 1 | from django.db.backends.base.schema import BaseDatabaseSchemaEditor |
4 | 2 | from django.db.models import Index, UniqueConstraint |
5 | | -from pymongo import ASCENDING, DESCENDING |
6 | | -from pymongo.operations import IndexModel |
7 | 3 |
|
8 | 4 | from .fields import EmbeddedModelField |
9 | 5 | from .query import wrap_database_errors |
@@ -264,43 +260,12 @@ def alter_unique_together( |
264 | 260 | def add_index( |
265 | 261 | self, model, index, *, field=None, unique=False, column_prefix="", parent_model=None |
266 | 262 | ): |
267 | | - if index.contains_expressions: |
268 | | - return |
269 | | - kwargs = {} |
270 | | - filter_expression = defaultdict(dict) |
271 | | - if index.condition: |
272 | | - filter_expression.update(index._get_condition_mql(model, self)) |
273 | | - if unique: |
274 | | - kwargs["unique"] = True |
275 | | - # Indexing on $type matches the value of most SQL databases by |
276 | | - # allowing multiple null values for the unique constraint. |
277 | | - if field: |
278 | | - column = column_prefix + field.column |
279 | | - filter_expression[column].update({"$type": field.db_type(self.connection)}) |
280 | | - else: |
281 | | - for field_name, _ in index.fields_orders: |
282 | | - field_ = model._meta.get_field(field_name) |
283 | | - filter_expression[field_.column].update( |
284 | | - {"$type": field_.db_type(self.connection)} |
285 | | - ) |
286 | | - if filter_expression: |
287 | | - kwargs["partialFilterExpression"] = filter_expression |
288 | | - index_orders = ( |
289 | | - [(column_prefix + field.column, ASCENDING)] |
290 | | - if field |
291 | | - else [ |
292 | | - # order is "" if ASCENDING or "DESC" if DESCENDING (see |
293 | | - # django.db.models.indexes.Index.fields_orders). |
294 | | - ( |
295 | | - column_prefix + model._meta.get_field(field_name).column, |
296 | | - ASCENDING if order == "" else DESCENDING, |
297 | | - ) |
298 | | - for field_name, order in index.fields_orders |
299 | | - ] |
| 263 | + idx = index.create_mongodb_index( |
| 264 | + model, self, field=field, unique=unique, column_prefix=column_prefix |
300 | 265 | ) |
301 | | - idx = IndexModel(index_orders, name=index.name, **kwargs) |
302 | | - model = parent_model or model |
303 | | - self.get_collection(model._meta.db_table).create_indexes([idx]) |
| 266 | + if idx: |
| 267 | + model = parent_model or model |
| 268 | + self.get_collection(model._meta.db_table).create_indexes([idx]) |
304 | 269 |
|
305 | 270 | def _add_composed_index(self, model, field_names, column_prefix="", parent_model=None): |
306 | 271 | """Add an index on the given list of field_names.""" |
|
0 commit comments