[Python] Mutazione di un oggetto dall'interno...

Manlio Perillo manlio_perillo a libero.it
Ven 23 Feb 2007 19:19:58 CET


Massimo ha scritto:
> Manlio Perillo ha scritto:
> [...]
> Ok, mi sta anche bene... infatti se l'ipotetico utente mi inserisse in 
> pk dei valori già presenti io vorrei appunto caricare l'oggetto, e 
> lasciargli poi modificare i campi non-pk, quindi consentirgli l'update. 
> Questo era più o meno il senso...
> 

Ora mi è più chiaro cosa vuoi fare.
Credo che comunque tu stia seguendo un approccio leggermente errato.

Se l'utente vuole creare un nuovo dato, l'interfaccia deve essere 
diversa dal caso in cui vuole caricare un dato già esistente.

Sono due operazioni diverse.
Infatti per caricare un oggetto ti serve solo la sua primary key, per 
crearne uno nuovo di solito ti servono altri dati.

Se l'utente inserisce dei dati già presenti, gli si mostra un errore.


> [...]
> 
>> Non sono proprio sicuro di capire la logica del tutto.
>> Quando vuoi salvare un oggetto, lo crei e quindi fai sess.save(obj) .
> 
> Ok. Tutto bene se il nuovo oggetto non ha equivalente nel dbms, ma se 
> esiste un equivalente record l'ORM mi solleva eccezione e non riesco a 
> fare l'update.
> 

Questo problema si deve eliminare alla radice, tenendo ben separate le 
due interfacce.

>> Se lo vuoi caricare fai sess.load(pk)
> 
> Mi va bene facendo:
> oggetto = session.load(pk)
> 
> ma io volevo preparare un comportamento quale:
> oggetto.load(pk)
> 
>> In genere le operazioni "crea nuovo" e "modifica esistente" sono ben 
>> separate, ma sembra esserci diversa gente per cui non è così (tanto 
>> che MySQL ha un INSERT OR UPDATE).
> 
> Secondo me dipende molto da cosa vuoi lasciar fare all'utente finale. 
> L'obiettivo che vorrei raggiungere io è lasciargli creare un nuovo 
> oggetto. Poi inserisce i valori che vuole. Quando completa la pk il 
> framework gli dice: occhio che già c'è questo oggetto. Se vuoi lo carico 
> così puoi modificarlo. In alternativa, cambia alcuni campi (quelli che 
> compongono la pk, così da prepararne una nuova).
> 
> Non so se sono riuscito a far comprendere la logica applicativa che ho 
> in mente...
> 


Si, sei stato chiarissimo.


obj = MyClass(*kwargs)
sess.save(obj(
try:
    sess.flush()
except SQLError:
    obj = sess.load(...)
    # Mostra pannello per la modifica



 > [...]



Saluti  Manlio Perillo


Maggiori informazioni sulla lista Python