我一直在测试mongoengine。我想更新文档的某些字段,并知道使用pre_save方法更改了哪些字段
我有以下文件
from mongoengine import Document, StringField, EmailField, IntField, signals
import bcrypt
class Users(Document):
name = StringField(required=True)
mail = EmailField(required=True, unique=True)
age = IntField(required=True, default=0)
password = StringField(min_length=7, required=True)
@classmethod
def pre_save(cls, sender, document, **kwargs):
# if password.isChanged(): <-- How can I get this?
# document.password = bcrypt(document.password, "randonSalt")
signals.pre_save.connect(Users.pre_save, sender=Users)
我尝试访问document._changed_fields
,但显示为空数组
谢谢大家
不是从_
开始使用方法的最佳实践,但是Document
具有受保护的方法document._delta()
。这些方法返回已显式更改的值。
class Users(Document):
name = StringField(required=True)
mail = EmailField(required=True, unique=True)
age = IntField(required=True, default=0)
password = StringField(min_length=7, required=True)
@classmethod
def pre_save(cls, sender, document, **kwargs):
updates, removals = document._delta()
if 'password' in updates:
print('new not saved password:', updates['password'])
else:
print('password isn\'t changed')
signals.pre_save.connect(Users.pre_save, sender=Users)
用法示例:
>> user = Users(name='uname', mail='[email protected]', age=2, password='secret0').save()
new not saved password: secret0
>> user.name = 'Name'
>> user.password = 'super-secret'
>> user.save()
new not saved password: super-secret
>> user.name = 'New Name'
>> user.save()
password isn't changed