Entità nidificate in Google App Engine. Lo faccio bene?

2

Cercando di sfruttare la maggior parte del concetto di entità GAE di Datastore, ma alcuni dubbi mi forzano la testa.

Dire che ho il modello:

class User(ndb.Model):
    email = ndb.StringProperty(indexed=True)
    password = ndb.StringProperty(indexed=False)
    first_name = ndb.StringProperty(indexed=False)
    last_name = ndb.StringProperty(indexed=False)
    created_at = ndb.DateTimeProperty(auto_now_add=True)

    @classmethod
    def key(cls, email):
        return ndb.Key(User, email)

    @classmethod
    def Add(cls, email, password, first_name, last_name):
        user = User(parent=cls.key(email),
                    email=email,
                    password=password,
                    first_name=first_name,
                    last_name=last_name)
        user.put()
        UserLogin.Record(email)


class UserLogin(ndb.Model):
    time = ndb.DateTimeProperty(auto_now_add=True)

    @classmethod
    def Record(cls, user_email):
        login = UserLogin(parent=User.key(user_email))
        login.put()

E ho bisogno di tenere traccia dei tempi di operazioni di login di successo. Ogni volta che l'utente effettua l'accesso, verrà eseguito un metodo UserLogin.Record() . Ora la domanda - lo faccio bene?

Grazie.

MODIFICA 2

Ok, ho usato gli argomenti digitati, ma poi ha generato questo: Expected Key instance, got User(key=Key('User', 5418393301680128), created_at=datetime.datetime(2013, 6, 27, 10, 12, 25, 479928), email=u'[email protected]', first_name=u'First', last_name=u'Last', password=u'password') . È chiaro da capire, ma non capisco perché i documenti siano fuorvianti? Propongono implicitamente di usare:

# Set Employee as Address entity's parent directly...
address = Address(parent=employee)

Ma il modello si aspetta la chiave. E la cosa peggiore è che parent=user.key() giura che key() non è callable. E ho scoperto che user.key funziona.

MODIFICA 1

Dopo aver letto l' esempio dai documenti e provato a replicarlo - ho ottenuto errore di tipo: %codice%. Questo è il codice exacto utilizzato:

user = User('[email protected]', 'password', 'First', 'Last')
user.put()

stamp = UserLogin(parent=user)
stamp.put()

Capisco che Model abbia avuto l'argomento sbagliato, MA perché è nella documentazione?

    
posta Aleksandr Makov 27.06.2013 - 11:23
fonte

1 risposta

1

Sì, questo metodo di registrazione degli accessi dovrebbe funzionare. Penserei se hai davvero bisogno di archiviare i record di accesso nel database, però. L'altro modo per farlo è scrivere gli accessi al tuo log, in questo modo:

logging.info("User %s logged in" % user.email)

È necessario utilizzare gli argomenti denominati anziché gli argomenti posizionali durante l'inizializzazione di qualsiasi sottoclasse Model. Invece di questo:

user = User('[email protected]', 'password', 'First', 'Last')

crea il tuo utente in questo modo:

user = User(email='[email protected]', password='password', first_name='First', last_name='Last')

E sembra che tu abbia scoperto un problema con la documentazione riguardante Address(parent=employee) . Basta usare la chiave, suppongo. Buona cattura.

A proposito, il forum di supporto ufficiale di App Engine è Stack Overflow, quindi è meglio pubblicare le domande lì.

    
risposta data 15.07.2013 - 12:27
fonte

Leggi altre domande sui tag