2017-08-23 1 views
2

docs Nach dem offiziellen Eibisch zu wiederholen, ist es empfehlenswert, ein Schema zu erklären und dann eine separate Klasse, die Daten, wie diese geladen empfängt:Eibisch Verwendung ohne mich

class UserSchema(Schema): 
    name = fields.Str() 
    email = fields.Email() 
    created_at = fields.DateTime() 

    @post_load 
    def make_user(self, data): 
     return User(**data) 

jedoch meine User Klasse würde in etwa so aussehen:

class User: 
    def __init__(name, email, created_at): 
     self.name = name 
     self.email = email 
     self.created_at = created_at 

Dies scheint mich unnötig zu wiederholen und ich habe nicht wirklich wie die Attributnamen zu schreiben, drei weitere Male. Ich mag jedoch IDE-Autokomplettierung und statische Typprüfung auf wohldefinierten Strukturen.

Gibt es also eine Best Practice zum Laden von serialisierten Daten nach einem Marshmallow-Schema, ohne eine andere Klasse zu definieren?

Antwort

1

Für Vanilla-Python-Klassen gibt es keine vorgefertigte Möglichkeit, die Klasse für das Schema zu definieren, ohne die Feldnamen zu wiederholen.

from marshmallow_sqlalchemy import ModelSchema 
from my_alchemy_models import User 

class UserSchema(ModelSchema): 
    class Meta: 
     model = User 

Gleiches gilt für flaschen sqlalchemy die flask_marshmallow.sqla.ModelSchema verwendet:

Wenn Sie SQLAlchemy zum Beispiel unter Verwendung sind, können Sie das Schema direkt aus dem Modell mit marshmallow_sqlalchemy.ModelSchema definieren.

Im Fall von Vanille Python-Klassen, können Sie die Felder einmal definieren und sowohl für Schema und Modell/Klasse verwenden:

USER_FIELDS = ('name', 'email', 'created_at') 

class User: 
    def __init__(self, name, email, created_at): 
     for field in USER_FIELDS: 
      setattr(self, field, locals()[field]) 

class UserSchema(Schema): 
    class Meta: 
     fields = USER_FIELDS 

    @post_load 
    def make_user(self, data): 
     return User(**data) 
+1

die Klasse definiert mit 'setattr' mich daran hindert, Validierungsregeln spezifizieren, die ist der Grund, warum ich mich mit Marshmallow beschäftige. Ich könnte ein 'collections.namedtuple' verwenden, aber das scheint ziemlich plump zu sein, wenn verschachtelte Schemas beteiligt sind. – Teyras

+0

@Teyras In solchen Fällen müssen Sie die Felder wiederholen. Die Dokumentation macht das explizit. –

Verwandte Themen