Se ho alcuni valori (stringa) da una richiesta GET o POST con le istanze Property
associate, uno IntegerProperty
e uno TextProperty
, ad esempio, esiste un modo per convertire i valori nei tipi appropriati (utente) senza una lunga catena noiosa delle chiamate isinstance
?Modo corretto per convertire una stringa nel tipo corretto per una proprietà NDB?
Sto cercando di riprodurre questo tipo di funzionalità (tutto convalida dell'input omesso per chiarezza):
for key, value in self.request.POST.iteritems():
prop = MyModel._properties[key]
if isinstance(prop, ndb.IntegerProperty):
value = int(value)
elif isinstance(prop, (ndb.TextProperty, ndb.StringProperty)):
pass # it's already the right type
elif ...
else
raise RuntimeError("I don't know how to deal with this property: {}"
.format(prop))
setattr(mymodelinstance, key, value)
Per esempio, se c'è un modo per ottenere la classe int
da un IntegerProperty
e la classe bool
da un BooleanProperty
ecc., farebbe il lavoro.
L'API di metadati ndb in realtà non risolve in modo elegante, per quanto posso vedere; con get_representations_of_kind
posso tuttavia ridurre il numero di casi.
Posso sentire il tuo dolore ... una domanda però, avresti dovuto conoscere i tipi di dati previsti dagli articoli ** POST **, quindi perché non ottenere solo i ** valori ** previsti ** le chiavi ** e le converti nel tipo appropriato? – Anzel
@Anzel Non sei sicuro di cosa intendi con la conoscenza dei tipi di dati previsti dagli articoli POST. Nella definizione del modello ho 45 proprietà di alcuni tipi diversi; nell'interesse di Non ripetere se stessi Mi piacerebbe non ripetere la mappatura tra i nomi di proprietà e tipi ovunque, ma so ancora se un valore come "Vero" o "5" deve essere interpretato come un bool, una stringa o un int . –
Capisco cosa stai cercando di fare, ma dato che i dati che stai per CONVERT sono nei dati GET/POST, puoi definire una funzione di conversione per mappare la coppia chiave/valore ... – Anzel