2017-03-29 11 views
2

Flask, SQLAlchemy 및 Marshmallow를 사용하여 Python 3.4에서 REST API 응용 프로그램을 작성하려고합니다.SqlAlchemy 및 Marshmallow를 사용하여 중첩 된 객체로 JSON 문자열을 비 윤곽화하는 중 오류가 발생했습니다.

내 모델에는 MailAddress 클래스와 일대 다 관계로 User 클래스가 있습니다.

GET 요청을 실행하면 DB에서 데이터를 읽을 수 없으며 데이터가 JSON 문자열로 올바르게 반환됩니다. (같은 내 모델 클래스에 __hash__ 기능을 추가하려고했습니다

File "X:\test\...\site-packages\sqlalchemy\orm\collections.py", line 785, in bulk_replace 
     constants = existing_idset.intersection(values or()) 
    File "X:\test\...\site-packages\sqlalchemy\util\_collections.py", line 612, in intersection 
     result._members.update(self._working_set(members).intersection(other)) 
    TypeError: unhashable type: 'dict' 

: 좀 MailAddressesUser 객체의 JSON 직렬화와 POST 요청을 실행하는 경우

대신, 나는이 오류 sqlalchemy: TypeError: unhashable type creating instance, sqlalchemy에서 제안)하지만 도움이되지 못했습니다. 내가 부족 뭔가

from flask import Flask, request 
from flask_marshmallow import Marshmallow 
from flask_sqlalchemy import SQLAlchemy 
from marshmallow import fields 
from sqlalchemy import Table, Column, Integer, String, ForeignKey 
from sqlalchemy.orm import relationship 

class Config(object): 
    SQLALCHEMY_DATABASE_URI = '<CONNECTION STRING HERE>' 
    SQLALCHEMY_TRACK_MODIFICATIONS = False 

app = Flask(__name__) 
app.config.from_object(Config) 
db = SQLAlchemy(app) 
ma = Marshmallow(app) 

# Model 
class MailAddress(db.Model): 
    __tablename__ = 'mail_addresses' 
    id = Column(Integer, primary_key=True) 
    user_id = Column(Integer, ForeignKey('users.id')) 
    mail_type = Column(String(200), nullable=False) 
    mail = Column(String(200), nullable=False) 
    def __init__(self, mail, mail_type): 
     self.mail = mail 
     self.mail_type = mail_type 

class MailAddressSchema(ma.ModelSchema): 
    class Meta: 
     model = MailAddress 

class User(db.Model): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(200), nullable=False) 
    mail_addresses = relationship('MailAddress', backref='user') 
    def __init__(self, name, mail_addresses): 
     self.name = name 
     self.mail_addresses = mail_addresses 
    def __hash__(self): 
     return hash(self.name) 

class UserSchema(ma.ModelSchema): 
    mail_addresses = fields.Nested(MailAddressSchema, many = True, only=('mail', 'mail_type')) 
    class Meta: 
     model = User 

# Routes 
user_schema = UserSchema() 

@app.route('/api/v0/user', methods=['GET']) 
def user_get(): 
    users = db.session.query(User).all() 
    return user_schema.jsonify(users, many = True), 200 

@app.route('/api/v0/user', methods=['POST']) 
def user_create(): 
    new_instance = user_schema.make_instance(request.json) 
    db.session.add(new_instance) 
    db.session.commit() 
    return user_schema.jsonify(new_instance), 201 

# Main 
if __name__ == '__main__': 
    app.run('localhost', 5555) 

있습니까 : 여기

이 문제를 보여줍니다 완전한 코드 예입니다?

답변

0

사용 load 대신 make_instance

@app.route('/api/v0/user', methods=['POST']) 
def user_create(): 
    new_instance, errors = user_schema.load(request.json) 
    db.session.add(new_instance) 
    db.session.commit() 
    return user_schema.jsonify(new_instance), 201