如何知道更新后哪些字段已更改?

问题描述 投票:0回答:1

我一直在测试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,但显示为空数组

谢谢大家

python mongoengine
1个回答
0
投票

不是从_开始使用方法的最佳实践,但是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
© www.soinside.com 2019 - 2024. All rights reserved.