Как узнать, какие поля изменились после обновления? - PullRequest
0 голосов
/ 12 октября 2019

Я тестировал 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, но он показываеткак пустой массив

Спасибо всем

1 Ответ

0 голосов
/ 23 октября 2019

Не рекомендуется использовать методы, начинающиеся с _, но 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='some@gmail.com', 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
...