Mongoengine 0.8.0在模型中打破了我的自定义setter属性

Jef*_* Li 8 python mongoengine

在Mongoengine 0.7.10中,我仍然可以做以下事情:

class User(db.Document):
    email = db.EmailField(unique=True, required=True)
    _password = db.StringField(max_length=255, required=True)

    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, password):
        self._password = bcrypt.generate_password_hash(password)
user = User(email='1@1.com', password='12345')
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码在0.8.0中断: ValidationError: ValidationError (User:None) (_password.Field is required: ['User'])

似乎MongoEngine在启动期间无法识别我的自定义密码设置器.我必须手动编写这些来修复它:

user = User(email='1@1.com')
user.password='12345'
Run Code Online (Sandbox Code Playgroud)

这可能是由于以下变化(来自Mongonengine 0.8升级说明):

Previously, if you had data the database that wasn’t defined in the Document definition, it would set it as an attribute on the document. This is no longer the case and the data is set only in the document._data dictionary:

我想知道这是有意还是MongoEngine中的错误?在我的模型中编写自定义属性setter的最佳做法是什么?

Ham*_*FzM 5

试试这个代码:

class User(db.Document):
    email = db.EmailField(unique=True, required=True)
    _password = db.StringField(max_length=255, required=True, db_field='password')

    def __init__(self, *args, **kwargs):
            db.Document.__init__(self, *args, **kwargs)

            if 'password' in kwargs:
                self.password = kwargs['password']

    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, password):
        self._password = bcrypt.generate_password_hash(password)
user = User(email='1@1.com', password='12345')
Run Code Online (Sandbox Code Playgroud)

这个对我有用。


Ros*_*oss 1

这不是一个错误 - 它清除了一些其他错误,并且是升级文档中提到的预期操作。然而,这对于这种情况来说并不好!

我认为创建密码哈希的自定义方法会更好,例如:set_password check_password 等...

过去已经有PasswordField 实现,我将把它添加到extras-mongoengine 中。