2017-08-23 52 views
2

根據官方棉花糖文檔,建議申報模式,然後有一個接收加載數據的單獨的類,像這樣:使用棉花糖不重複自己

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

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

但是,我User班會是這個樣子:

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

這似乎是不必要的重複自己,我真的不喜歡寫的屬性名稱三次。但是,我喜歡IDE自動完成和靜態類型檢查定義良好的結構。

那麼,是否有任何最佳實踐,根據棉花糖架構加載序列化數據,而不需要定義另一個類?

回答

1

對於vanilla Python類,沒有一種開箱即用的方式來爲模式定義類而不重複字段名稱。

如果您在使用例如SQLAlchemy的,您可以直接從模型marshmallow_sqlalchemy.ModelSchema定義模式:

from marshmallow_sqlalchemy import ModelSchema 
from my_alchemy_models import User 

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

同樣適用於使用flask_marshmallow.sqla.ModelSchema燒瓶SQLAlchemy的。

在香草Python類的情況下,你可以一次定義的字段,並使用其來進行架構和模型/類:

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

定義類'setattr'阻止我指定的驗證規則,這就是我最終打擾棉花糖的原因。我可以使用'collections.namedtuple',但是當嵌套模式涉及時,這看起來相當笨拙。 – Teyras

+0

@Teyras對於這種情況,我想你必須重複這些字段。文檔明確地這樣做。 –