Jeśli mam niektóre wartości (łańcuchowe) z żądania GET lub POST z powiązanymi instancjami Property
, jeden z nich to IntegerProperty
i jeden TextProperty
, czy istnieje sposób przekonwertowania wartości na odpowiednie typy (użytkownika) bez długiego żmudnego łańcucha połączeń isinstance
?Prawidłowy sposób konwertowania ciągu znaków na właściwy typ dla właściwości NDB?
szukam do odtworzenia tego rodzaju funkcjonalność (wszystkie walidacji wejścia pominięte dla jasności):
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)
Na przykład, jeśli istnieje sposób, aby uzyskać klasę int
z IntegerProperty
a klasa bool
od BooleanProperty
itd., który wykonałby zadanie.
Interfejs API metadanych ndb tak naprawdę nie rozwiązuje tego w sposób elegancki, o ile widzę; z get_representations_of_kind
mogę jednak zmniejszyć liczbę przypadków.
Czuję twój ból ... jedno pytanie, powinieneś znać oczekiwane typy danych z pozycji ** POST **, więc dlaczego nie po prostu uzyskać ** wartości ** zgodnie z oczekiwaniami ** klucze ** i przekonwertować je na odpowiedni typ? – Anzel
@Anzel Nie wiesz, co masz na myśli mówiąc o oczekiwanych typach danych z elementów POST. W definicji modelu mam 45 właściwości kilku różnych typów; w interesie Nie powtarzaj się Nie chciałbym powtarzać mapowania pomiędzy nazwami i typami właściwości w dowolnym miejscu, ale wciąż wiem, czy wartość taka jak "prawda" czy "5" musi być interpretowana jako bool, string lub int . –
Rozumiem, co próbujesz zrobić, ale ponieważ dane, które zamierzasz zamienić na CONVERT są albo w danych GET/POST, możesz zdefiniować funkcję konwersji, aby odwzorować parę klucz/wartość ... – Anzel