in Mongoengine 0.7.10, kann ich immer noch Dinge wie:Mongoengine 0.8.0 bricht meine benutzerdefinierte Set-Eigenschaft in Modellen
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')
die oben genannten Code bricht in 0.8.0 jedoch: ValidationError: ValidationError (User:None) (_password.Field is required: ['User'])
Es scheint, dass MongoEngine meinen benutzerdefinierten Passwort-Setter während der Initiierung nicht erkannt hat. Ich muss diese manuell schreiben, um es zu beheben:
user = User(email='[email protected]')
user.password='12345'
Dies ist wahrscheinlich auf Grund der folgenden Änderungen (ab 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:
Ich möchte wissen, ob dies beabsichtigt ist oder es ein Fehler in MongoEngine? Was ist die beste Vorgehensweise, um den benutzerdefinierten Eigenschaften-Setter in mein Modell zu schreiben?
Haben Sie versucht, '__init__' zu verlängern? –
@ThomasOrozco Meinen Sie sich so? 'def __init __ (selbst, E-Mail, Passwort):' Mongoengine wird '_password' in' User.init() 'Methode übergeben, wenn mongoengine die Dokumente aus der Datenbank lädt. Dies würde die App zum Absturz bringen, weil die '__init__' Methode' _password' nicht akzeptiert. – Jiequan
Sie sollten die Signatur der bereits existierenden Methode wiederverwenden, möglicherweise mit '* args' und' ** kwargs'. –