2015-09-23 22 views
5

Używam marshmallow 2.0.0rc2 do sprawdzania danych wejściowych na żądaniach HTTP i do ładowania modeli SQLAlchemy do JSON w odpowiedziach HTTP. I natknąłem się na 2 problemy:Wymuszenie `Brak` przy ładowaniu i pomijanie` Brak` na zrzucie

Po pierwsze, podczas ładowania danych z JSON na żądanie HTTP PUT, chcę wypełnić wszystkie brakujące pola jako Brak, aby poprawnie nadpisać dane w SQLAlchemy. Teraz używam następujący kod:

for name, field in schema.fields.iteritems(): 
    if field.missing == ma.missing: 
     schema.fields[name].missing = None 

to działa, ale przypuszczam, że to podsłuch ponieważ jestem brudząc z marshmallow.Field przykład dołączony do Schema klasie. Po usunięciu instancji Schema wszystkie łatane przez nas pola zostaną zablokowane nowym brakującym zamiast domyślnym.

Po drugie, podczas przesyłania danych z SQLAlchemy do JSON wszystkie brakujące pola są rozwiązywane jako Brak, a JSON wypełnione danymi {"key": null, }. Jest to niepożądane zachowanie i czyszczę je na wyzwalaczu post_dump.

@post_dump 
def clean_missing(self, data): 
    for key in filter(lambda key: data[key] is None, data): 
     data.pop(key) 
    return data 

samo jak poprzednie, to działa, ale obejmuje tworzenie jakiś BaseSchema klasy czarownicę przechodzi tę logikę do wszystkich dziedzicznych klas.

Przeszukałem dokumentację na czas i nie znalazłem żadnego prawidłowego sposobu zamiany tego zachowania, tj. Pomijania pól podczas wysypywania i wypełniania pól przy użyciu polecenia None podczas ładowania. Czy brakuje mi czegoś lub pianki nie zapewniam takich funkcji?

Odpowiedz

1

Aby wymusić Brak obciążenia, można użyć missing parameter:

brakuje - Domyślna wartość deserializacjia na polu, jeśli pole nie występuje w danych wejściowych. Może być wartością lub podpisem.

class ExampleSchema(Schema): 
    field_a = fields.Int(missing=None) 

Odnośnie drugiego momencie docs wydaje się, że z 2,0 na brakujące pola są wyłączone z produkcji odcinkach.

Powiązane problemy