首页 > 解决方案 > 具有唯一值或 null 的 Django MongoDB 模型字段

问题描述

我正在使用 Djongo v1.3.6 将 Django 连接到 MongoDB。现在我想有一个唯一值的可选字段 - 在我的情况下是电话号码。我认为可以将 null 作为没有电话号码的帐户的占位符。但是,MongoDB 似乎也将 null 视为唯一值。因此,一旦一个对象具有phone_number: null

我试图为phone_numberas声明索引,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},
        ],
    }

非常感谢任何帮助。

标签: djangomongodbdjongo

解决方案


我解决了这个问题,改变了 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,而不会牺牲对非空值的唯一检查


推荐阅读