#django #mongodb #djongo
Вопрос:
Я использую Djongo v1.3.6 для подключения Django к MongoDB. Теперь я хотел бы иметь дополнительное поле для уникального значения — в моем случае номер телефона. Я подумал, что можно использовать null в качестве заполнителя для учетных записей, у которых нет номера телефона. Однако MongoDB, похоже, также рассматривает значение null как уникальное значение. Таким образом, он не позволяет мне вставлять новые объекты в базу данных, как только один объект phone_number: null
Я попытался объявить индекс для phone_number
as sparse
, но это, похоже, не возымело никакого эффекта. Я некоторое время искал в Интернете, но не смог найти ничего полезного для своего дела.
class UserProfile(models.Model): user = models.OneToOneField(AUTH_USER_MODEL, on_delete=models.CASCADE) phone_number = models.CharField(validators=[PHONE_VALIDATOR], max_length=17, unique=True, null=True, blank=True) ... meta = { 'indexes': [ {'fields': ['phone_number'], 'sparse' : True, 'unique' : True}, ], }
Любая помощь очень ценится.
Ответ №1:
Я решил эту проблему, изменив индекс, созданный Djongo с помощью pymongo.
from pymongo import MongoClient, database, collection collection.drop_index(index_name) index_name = rchop(index_name, '_1') collection.create_index( [(index_name, pymongo.ASCENDING)], partialFilterExpression = { index_name : { "$exists" : True, "$gt" : "0", "$type" : "string" } } )
Как только я изменил индекс, я смог вставить нулевые значения в MongoDB, не жертвуя уникальной проверкой ненулевых значений