marshmallow의 schema 플러그인
5730 단어 pythonmarshmallowserialization
schema는 대상 간의 관계(예를 들어 키 관계)를 표시하기 위해 끼워 넣을 수 있다.
예를 들어 다음 예제에서 Blog에는 User 객체로 표시되는 author 속성이 있습니다.
import datetime as dt
class User(object):
def __init__(self, name, email):
self.name = name
self.email = email
self.created_at = dt.datetime.now()
self.friends = []
self.employer = None
class Blog(object):
def __init__(self, title, author):
self.title = title
self.author = author # A User object
Nested
하위 클래스를 사용하여 끼워 넣은 schema를 수신하면 양자의 관계를 나타낸다.from marshmallow import Schema, fields, pprint
class UserSchema(Schema):
name = fields.String()
email = fields.Email()
created_at = fields.DateTime()
class BlogSchema(Schema):
title = fields.String()
author = fields.Nested(UserSchema)
시리얼화된 블로그 객체에는 중첩된 사용자 객체가 포함됩니다.
user = User(name="Monty", email="[email protected]")
blog = Blog(title="Something Completely Different", author=user)
result = BlogSchema().dump(blog)
pprint(result)
# {'title': u'Something Completely Different',
# 'author': {'name': u'Monty',
# 'email': u'[email protected]',
# 'created_at': '2014-08-17T14:58:57.600623+00:00'}}
필드 플러그인 대상이 하나의 집합이라면
many=True
를 설정해야 합니다. 예를 들어 collaborators = fields.Nested(UserSchema, many=True)
네스트된 객체의 시리얼화된 필드 지정설정
only
매개변수를 사용하여 네스트된 객체의 등록 정보를 명시적으로 시리얼화할 수 있습니다.class BlogSchema2(Schema):
title = fields.String()
author = fields.Nested(UserSchema, only=["email"])
schema = BlogSchema2()
result = schema.dump(blog)
pprint(result)
# {
# 'title': u'Something Completely Different',
# 'author': {'email': u'[email protected]'}
# }
점 구분자를 사용하여 내포된 객체의 심층 속성을 나타낼 수 있습니다.
class SiteSchema(Schema):
blog = fields.Nested(BlogSchema2)
schema = SiteSchema(only=['blog.author.email'])
result, errors = schema.dump(site)
pprint(result)
# {
# 'blog': {
# 'author': {'email': u'[email protected]'}
# }
# }
only
매개 변수에 문자열(위의 예는 목록을 전달함)이 전달되면 단일 값(위의 예는 키 값 매핑)이나 값의 목록을 되돌려줍니다(설정이 필요함many=True
:class UserSchema(Schema):
name = fields.String()
email = fields.Email()
friends = fields.Nested('self', only='name', many=True)
# ... create ``user`` ...
result, errors = UserSchema().dump(user)
pprint(result)
# {
# "name": "Steve",
# "email": "[email protected]",
# "friends": ["Mike", "Joe"]
# }
양방향 중첩
서로 끼워 넣은 두 대상에 대해 클래스 이름으로 끼워 넣은 schema를 인용할 수 있습니다. 인용할 때 이 schema가 정의되지 않았음에도 불구하고.
다음 예에서 Author와 Book 객체는 일대다 관계입니다.
class AuthorSchema(Schema):
# only exclude
books = fields.Nested('BookSchema', many=True, exclude=('author', ))
class Meta:
fields = ('id', 'name', 'books')
class BookSchema(Schema):
author = fields.Nested(AuthorSchema, only=('id', 'name'))
class Meta:
fields = ('id', 'title', 'author')
from marshmallow import pprint
from mymodels import Author, Book
author = Author(name='William Faulkner')
book = Book(title='As I Lay Dying', author=author)
book_result, errors = BookSchema().dump(book)
pprint(book_result, indent=2)
# {
# "id": 124,
# "title": "As I Lay Dying",
# "author": {
# "id": 8,
# "name": "William Faulkner"
# }
# }
author_result, errors = AuthorSchema().dump(author)
pprint(author_result, indent=2)
# {
# "id": 8,
# "name": "William Faulkner",
# "books": [
# {
# "id": 124,
# "title": "As I Lay Dying"
# }
# ]
# }
모듈을 가져오는 방식으로 삽입schema를 전달할 수도 있다. 예를 들어
books = fields.Nested('path.to.BookSchema', many=True, exclude=('author', ))
schema 자체 중첩Nested에 문자열 매개변수
self
를 전달하여 객체 자체와의 관계를 나타냅니다.class UserSchema(Schema):
name = fields.String()
email = fields.Email()
friends = fields.Nested('self', many=True)
# Use the 'exclude' argument to avoid infinite recursion
employer = fields.Nested('self', exclude=('employer', ), default=None)
user = User("Steve", '[email protected]')
user.friends.append(User("Mike", '[email protected]'))
user.friends.append(User('Joe', '[email protected]'))
user.employer = User('Dirk', '[email protected]')
result = UserSchema().dump(user)
pprint(result.data, indent=2)
# {
# "name": "Steve",
# "email": "[email protected]",
# "friends": [
# {
# "name": "Mike",
# "email": "[email protected]",
# "friends": [],
# "employer": null
# },
# {
# "name": "Joe",
# "email": "[email protected]",
# "friends": [],
# "employer": null
# }
# ],
# "employer": {
# "name": "Dirk",
# "email": "[email protected]",
# "friends": []
# }
# }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.