有没有办法在peewee中查询.all()?

时间:2017-05-03 08:57:42

标签: python orm sqlalchemy peewee

我需要将所有数据从表格传输到html页面。在SQLAlchemy中,它将是这样的。

class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    first = db.Column(db.String(80))
    last = db.Column(db.String(80))


@app.route('/authors')
def get_authors():
    authors = Author.query.all()
    # Serialize the queryset
    result = authors_schema.dump(authors)
    return jsonify({'authors': result.data})

Peewee中是否有类似 authors = Author.query.all()的内容?

3 个答案:

答案 0 :(得分:2)

所以我做到了。

@app.route('/authors')
def get_authors():
    authors = Author.select()
    return render_template('aurhors.html', authors=authors)

在html中就是这样的。

 {% for a in authors %}
 <p>{{a.author_name}}</p>
 {% endfor %}

我只是在开始学习python,所以感谢你的帮助。

答案 1 :(得分:0)

您要查找的是.dicts(),方法well-hidden in the docs,该方法返回特定于可重复的peewee的类型:

response = {'authors': []}
authors = Author.select()
for author in authors.dicts():
    response['authors'].append(author)

答案 2 :(得分:0)

据我所知,尽管all扩展名中有一个Dataset方法,记录在here中,但在peewee中不存在直接等效项。您可以使用列表推导很容易地做到这一点:

authors = [author for author in Author.select()]

或者甚至是authors = list(Author)。但是,如果您尝试将它们作为JSON返回,则将无法正常工作,因为您的作者列表由Author的实例填充,并且Flask的JSONEncoder不适用于此类型。您可以使用peewee的dicts()方法来解决此问题:

authors = [author for author in Author.select().dicts()]

完整的示例如下:

@app.route('/authors')
def get_authors():
    authors = [author for author in Author.select().dicts()]
    return jsonify(authors)

我经常使用marshmallow而不是使用dicts进行序列化。例如,您像这样创建一个author_schema

from marshmallow import Schema, fields

class AuthorSchema(Schema):
    id = fields.Integer(dump_only=True)
    first = fields.String()
    last = fields.String()

author_schema = AuthorSchema()

并像这样使用它(不显示导入):

@app.route('/authors')
def get_authors():
    authors = author_schema(Author, many=True)
    return jsonify(authors)