Flask-SQLAlchemy filter_by 并遵循多个反向引用
Flask-SQLAlchemy filter_by and follow multiple backrefs
我想从 Flask-SQLAlchemy Quickstart Simple Relationships example 扩展架构并添加一个名为 Editor
的 class。
我的架构现在看起来像这样:
from datetime import datetime
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80))
body = db.Column(db.Text)
pub_date = db.Column(db.DateTime)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
category = db.relationship('Category',
backref=db.backref('posts', lazy='dynamic'))
def __init__(self, title, body, category, pub_date=None):
self.title = title
self.body = body
if pub_date is None:
pub_date = datetime.utcnow()
self.pub_date = pub_date
self.category = category
def __repr__(self):
return '<Post %r>' % self.title
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
editor_id = db.Column(db.Integer, db.ForeignKey('editor.id'))
editor = db.relationship('Editor',
backref=db.backref('categories', lazy='dynamic'))
def __init__(self, name, editor):
self.name = name
self.editor = editor
def __repr__(self):
return '<Category %r>' % self.name
class Editor(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
def __init__(self, name):
self.name = name
def __repr__(self):
return '<Editor %r>' % self.name
快速入门示例中的查询,除了按编辑器查询类别外,一切正常:
>>> py = Category('Python')
>>> p = Post('Hello Python!', 'Python is pretty cool', py)
>>> e = Editor('dude')
>>> db.session.add(py)
>>> db.session.add(p)
>>> db.session.add(e)
>>> Post.query.filter_by(category=py).all()
[<Post 'Hello Python!'>]
>>> Category.query.filter_by(editor=e).all()
[<Category 'Python'>]
不过,我还想查找来自特定编辑的所有帖子。我尝试使用此查询:
>>> Post.query.filter_by(category.editor=e).all()
但是我得到了这个错误:
SyntaxError: keyword can't be an expression
我如何获得编辑的帖子?
你必须先加入 Post 和类别,我对你的测试做了一些小的更正:
db.create_all()
e = Editor('Dude')
py = Category('Python', e)
p = Post('Hello Python!', 'Python is pretty cool', py)
db.session.add(py)
db.session.add(p)
db.session.add(e)
print Post.query.filter_by(category=py).all()
print Category.query.filter_by(editor=e).all()
print Post.query.join(Category).filter_by(editor=e).all()
我想从 Flask-SQLAlchemy Quickstart Simple Relationships example 扩展架构并添加一个名为 Editor
的 class。
我的架构现在看起来像这样:
from datetime import datetime
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80))
body = db.Column(db.Text)
pub_date = db.Column(db.DateTime)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
category = db.relationship('Category',
backref=db.backref('posts', lazy='dynamic'))
def __init__(self, title, body, category, pub_date=None):
self.title = title
self.body = body
if pub_date is None:
pub_date = datetime.utcnow()
self.pub_date = pub_date
self.category = category
def __repr__(self):
return '<Post %r>' % self.title
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
editor_id = db.Column(db.Integer, db.ForeignKey('editor.id'))
editor = db.relationship('Editor',
backref=db.backref('categories', lazy='dynamic'))
def __init__(self, name, editor):
self.name = name
self.editor = editor
def __repr__(self):
return '<Category %r>' % self.name
class Editor(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
def __init__(self, name):
self.name = name
def __repr__(self):
return '<Editor %r>' % self.name
快速入门示例中的查询,除了按编辑器查询类别外,一切正常:
>>> py = Category('Python')
>>> p = Post('Hello Python!', 'Python is pretty cool', py)
>>> e = Editor('dude')
>>> db.session.add(py)
>>> db.session.add(p)
>>> db.session.add(e)
>>> Post.query.filter_by(category=py).all()
[<Post 'Hello Python!'>]
>>> Category.query.filter_by(editor=e).all()
[<Category 'Python'>]
不过,我还想查找来自特定编辑的所有帖子。我尝试使用此查询:
>>> Post.query.filter_by(category.editor=e).all()
但是我得到了这个错误:
SyntaxError: keyword can't be an expression
我如何获得编辑的帖子?
你必须先加入 Post 和类别,我对你的测试做了一些小的更正:
db.create_all()
e = Editor('Dude')
py = Category('Python', e)
p = Post('Hello Python!', 'Python is pretty cool', py)
db.session.add(py)
db.session.add(p)
db.session.add(e)
print Post.query.filter_by(category=py).all()
print Category.query.filter_by(editor=e).all()
print Post.query.join(Category).filter_by(editor=e).all()