2013-06-02 12 views
5

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?

+0

Czy próbowałeś rozszerzyć '__init__'? –

+1

@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

+0

Powinieneś ponownie użyć sygnatury metody, która już istnieje, potencjalnie rozszerzając ją o '* args' i' ** kwargs'. –

Odpowiedz

1

To nie jest błąd - czyści inne błędy i było zamierzonym działaniem, o którym mowa w dokumentach aktualizacji. Jednak to nie jest dobre dla tej sytuacji!

myślę niestandardową metodę tworzenia hash hasła będzie lepiej np set_password check_password etc ...

Nie zostały PasswordField implementacje w przeszłości i to jest coś dodam do extras-mongoengine.

+0

Witaj Ross, widziałem twoją aktualizację dotyczącą PasswordField tutaj https://github.com/MongoEngine/extras-mongoengine/ issues/8, ale nadal nie mogę się dowiedzieć, jak korzystać z tej poprawki, używam mongoengine 0.8.7, a także spróbuj ponownie zainstalować zgodnie z instrukcjami podanymi tutaj https://github.com/noQ/mongoengine ALE Kiedy próbuję użyć PasswordField pokazuje nieokreślony błąd. Sprawdzono również pola mongoengine.fields, ale nie ma pola PasswordField. Czy możesz mi pomóc? :) – CrazyGeek

4

Spróbuj ten kod:

class User(db.Document): 
    email = db.EmailField(unique=True, required=True) 
    _password = db.StringField(max_length=255, required=True, db_field='password') 

    def __init__(self, *args, **kwargs): 
      db.Document.__init__(self, *args, **kwargs) 

      if 'password' in kwargs: 
       self.password = kwargs['password'] 

    @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') 

To działa na mnie.

+1

Również jeśli chcesz zapisać go jako 'password' nie jako' _password' w db, to zrób to '_password = StringField (max_length = 255, required = True, db_field = 'password')' –