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'
: 좀 MailAddresses
내 User
객체의 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)
있습니까 : 여기
이 문제를 보여줍니다 완전한 코드 예입니다?