Поле модели Django MongoDB с уникальными значениями или нулем

#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, не жертвуя уникальной проверкой ненулевых значений