2017-03-19 40 views
4

SQLAlchemy 모델을 사용하여 Flask API를 만들고 있습니다. 쉽게 자체를 덤프 할 수 있도록, 내가 스키마를 가지고 각 모델을 원하는SQLAlchemy 모델에 대한 마쉬멜로우 스키마를 동적으로 생성하는 방법

class EntrySchema(ma.ModelSchema): 
    class Meta: 
     model = Entry 

: 나는 내가 가진 모든 모델의 스키마를 정의하고 싶지 않아, 나는이 모든 시간을 싶지 않아 . 는 기본 스키마를 작성 및 Schema.Meta.model 작동하지 않았다 설정 :

class Entry(db.Model): 
    __tablename__ = 'entries' 

    id = db.Column(db.Integer, primary_key=True) 
    started_at = db.Column(db.DateTime) 
    ended_at = db.Column(db.DateTime) 
    description = db.Column(db.Text()) 

    def __init__(self, data): 
     for key in data: 
      setattr(self, key, data[key]) 

     self.Schema = Schema 
     self.Schema.Meta.model = self.__class__ 

    def dump(self): 
     schema = self.Schema() 
     result = schema.dump(self) 
     return result 


class Schema(ma.ModelSchema): 
    class Meta: 
     pass 

가 왜 모델과 일반적인 스키마가 선언 된 모델과 스키마는 다른 덮어 쓰기? 클래스 속성 Entry.Schema로 사용할 수 있습니다

def add_schema(cls): 
    class Schema(ma.ModelSchema): 
     class Meta: 
      model = cls 
    cls.Schema = Schema 
    return cls 

다음

@add_schema 
class Entry(db.Model): 
    ... 

스키마 :

답변

4

당신은 당신의 모델에 Schema을 추가하는 수준의 장식을 만들 수 있습니다.

원래 시도가 실패한 이유는 marshmallow Schema 클래스가 custom metaclass 클래스를 사용하여 구성되었으며 클래스 본체 실행으로 생성 된 네임 스페이스와 does its thing을 검사합니다. 이미 생성 된 클래스를 수정하면 너무 늦습니다.

파이썬의 메타 클래스에 익숙하지 않은 사용자는 language reference에서 읽으십시오. 그들은 위대한 일들과 위대한 오용을 허용하는 도구입니다.

0

marshmallow recipes은 기본 스키마 옵션을 기본 클래스에 포함시키기위한 몇 가지 대체 옵션을 지정합니다.

# myproject/schemas.py 

from marshmallow_sqlalchemy import ModelSchema 

from .db import Session 

class BaseSchema(ModelSchema): 
    class Meta: 
     sqla_session = Session 

후 기본 스키마를 확장 : 여기에 바로 문서에서 간단한 예입니다

# myproject/users/schemas.py 

from ..schemas import BaseSchema 
from .models import User 

class UserSchema(BaseSchema): 

    # Inherit BaseSchema's options 
    class Meta(BaseSchema.Meta): 
     model = User 
이 방법의 장점은 특정 모델에 더 많은 드/직렬화를 추가 할 수 있다는 것입니다

링크 된 문서의 예제 및 요리법