Django有一些从DB到JSON格式返回的ORM模型的自动序列化.
如何将SQLAlchemy查询结果序列化为JSON格式?
我试过,jsonpickle.encode
但它编码查询对象本身.我试过了,json.dumps(items)
但它回来了
TypeError: <Product('3', 'some name', 'some desc')> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
是否真的很难将SQLAlchemy ORM对象序列化为JSON/XML?它没有默认的序列化器吗?现在序列化ORM查询结果是非常常见的任务.
我需要的只是返回SQLAlchemy查询结果的JSON或XML数据表示.
需要在javascript datagird中使用SQLAlchemy对象的JSON/XML格式的查询结果(JQGrid http://www.trirand.com/blog/)
我有一个用表映射的类,在我的例子中是以声明的方式,我想从这个类中"发现"表属性,列,名称,关系:
engine = create_engine('sqlite:///' + databasePath, echo=True)
# setting up root class for declarative declaration
Base = declarative_base(bind=engine)
class Ship(Base):
__tablename__ = 'ships'
id = Column(Integer, primary_key=True)
name = Column(String(255))
def __init__(self, name):
self.name = name
def __repr__(self):
return "<Ship('%s')>" % (self.name)
Run Code Online (Sandbox Code Playgroud)
所以现在我的目标是从"Ship"类中获取另一段代码中的表列及其属性.我想我可以使用检测来处理它,但SQLAlchemy API是否提供了任何方法?
我有一个sqlalchemy结果
labels = session.query(
LabelsData,
LabelsData.id,
LabelsData.name,
LabelsData.color
).filter(LabelsData.deleted==False).all()
Run Code Online (Sandbox Code Playgroud)
我想将此结果转换为JSON,但我该怎么做呢?
目前,我们以及大多数Web框架的序列化工作方式是某种类型的方法调用,它将模型转换为某种类型的格式.在我们的例子中,我们to_dict()
在每个模型上都有一个方法,它构造并返回一个键值字典,其中键是字段名,值是实例变量.
在我们的代码中,我们都有以下代码片段:json.dumps(**some_model_object.to_dict())
将序列化为some_model_object
json.最近,我们决定向用户公开一些内部资源,但是如果请求用户不是超级用户,则其中一些资源具有我们不希望在序列化期间传回的特定私有实例值.
我试图想出一个简洁的设计,允许更容易的序列化,以及允许我们序列化为json以外的格式.我认为这是面向方面设计/编程的一个非常好的用例,其中方面尊重请求访问控制并基于请求用户的持久性来序列化对象.
这是类似于我现在的东西:
from framework import current_request
class User(SQLAlchemyDeclarativeModel):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
first_name = Column(Unicode(255))
last_name = Column(Unicode(255))
private_token = Column(Unicode(4096))
def to_dict(self):
serialized = dict((column_name, getattr(self, column_name))
for column_name in self.__table__.c.keys())
# current request might not be bound yet, could be in a unit test etc.
if current_request and not current_request.user.is_superuser():
# we explicitly define the allowed items because if we accidentally add
# a private variable to …
Run Code Online (Sandbox Code Playgroud) 基本上,我只想json编码我的SQL查询的结果.
x = db.session.query(User).filter_by(username = request.form['username'], password = request.form['password']).first()
print vars(x)
return jsonify(x)
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: < User WashingtonGeorge> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
这是打印变量的结果(x)
{'_updated': None, 'username': u'WashingtonGeorge', 'password': u'Washington', '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7fd12a50c8d0>, 'firstname': u'George', 'lastname': u'Washington', '_created': None, 'fullname': u'George Washington', '_id': 1, 'email': u'WashingtonGeorge@yahoo.com'}
Run Code Online (Sandbox Code Playgroud) 我正在学习Backbone.js和Flask(和Flask-sqlalchemy).我之所以选择Flask,是因为我读到它与Backbone实现RESTful接口的效果很好.我目前正在学习使用(或多或少)此模型的课程:
class Tasks(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80), unique=True)
completed = db.Column(db.Boolean, unique=False, default=False)
def __init__(self, title, completed):
self.title = title
self.completed = completed
def json_dump(self):
return dict(title=self.title, completed=self.completed)
def __repr__(self):
return '<Task %r>' % self.title
Run Code Online (Sandbox Code Playgroud)
我必须添加一个json_dump
方法才能将JSON发送到浏览器.否则,我会得到错误object is not JSON serializable
,所以我的第一个问题是:
有没有更好的方法在Flask中进行序列化?似乎某些对象是可序列化的,但其他对象不是,但一般来说,它并不像我预期的那么容易.
过了一会儿,我最终得到了以下视图来处理每种类型的请求:
@app.route('/tasks')
def tasks():
tasks = Tasks.query.all()
serialized = json.dumps([c.json_dump() for c in tasks])
return serialized
@app.route('/tasks/<id>', methods=['GET'])
def get_task(id):
tasks = Tasks.query.get(int(id))
serialized = json.dumps(tasks.json_dump())
return serialized …
Run Code Online (Sandbox Code Playgroud) 我想序列化一个对象的查询集,该对象与另一个模型有一对多的关系.我想在json输出中包含相关对象.
例:
class Book(models.Model):
title = models.CharField()
author = models.ForeignKey('Author')
class Author(models.Model):
name = models.CharField()
view.py:
serializers.serialize('json', Author.objects.all()) #does not include the book objects
Run Code Online (Sandbox Code Playgroud)
我很确定有一个简单的解决方案,但到目前为止我无法弄清楚如何做到这一点.谢谢你的帮助!
I am creating a Point of Sales application, with the typical data hierarchy : Company->branches->Sales->SaleData, this is the model definition (Note that, the User model already prepare and working as a flask-login compatible model) :
from flask_sqlalchemy import SQLAlchemy
from main import db
from collections import OrderedDict
class Users(db.Model,object):
'''
Adding object to trun sqlalchemy into json object
'''
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(60), unique=True)
firstname = db.Column(db.String(20))
lastname = db.Column(db.String(20))
password = db.Column(db.String)
email = db.Column(db.String(100), unique=True) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试查询模型。
例如模型名称称为“Demo”,我想获取表的所有记录。
class Demo(db.Model):
__tablename__ = "demo"
field_1 = db.Column(db.String(255), nullable=False)
field_2 = db.Column(db.String(255), nullable=False)
Run Code Online (Sandbox Code Playgroud)
现在我正在查询
records = Messages.query.all()
Run Code Online (Sandbox Code Playgroud)
我正在尝试发送记录作为响应,所以我面临这个错误。我是烧瓶新手,请帮我解决一下。
python ×7
sqlalchemy ×5
flask ×4
json ×3
aop ×1
django ×1
eve ×1
flask-login ×1
rest ×1
sqlite ×1