w Mongoengine 0.7.10, nadal mogę robić takie rzeczy jak:Mongoengine 0.8.0 przerwy mój zwyczaj nieruchomość seter w modelach
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='[email protected]', password='12345')
Jednakże powyższe kod przerwy w 0.8.0: ValidationError: ValidationError (User:None) (_password.Field is required: ['User'])
Wygląda na to, że MongoEngine nie rozpoznał mojego niestandardowego ustawiacza hasła podczas inicjacji. Muszę ręcznie pisać te to naprawić:
user = User(email='[email protected]')
user.password='12345'
Wynika to prawdopodobnie z poniższymi zmianami (od Mongonengine 0.8 upgrading notes):
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:
Chciałbym wiedzieć, czy to ma lub jest to błąd w MongoEngine? Jaka jest najlepsza praktyka do napisania niestandardowego ustawiacza właściwości w moim modelu?
Czy próbowałeś rozszerzyć '__init__'? –
@ThomasOrozco Masz na myśli przedłużenie w ten sposób? 'def __init __ (self, email, password):' Mongoengine przejdzie '_password' do metody' User.init() ', gdy mongoengine ładuje dokumenty z bazy danych. Spowoduje to awarię aplikacji, ponieważ metoda "__init__" nie akceptuje '_password'. – Jiequan
Powinieneś ponownie użyć sygnatury metody, która już istnieje, potencjalnie rozszerzając ją o '* args' i' ** kwargs'. –