2017-10-17 58 views
0

我想用SQLAlchemy-DataTable为jQuery DataTables插件做数据的服务器端处理,但遇到了试图创建DataTables列模型的问题。使用SQLAlchemy-DataTables在同一个表之间存在多个关系

我的数据模型看起来像:

class Post(db.Model): 
    __tablename__ = 'posts' 
    id = db.Column(db.Integer, primary_key=True) 
    subject = db.Column(db.String(64)) 
    #... 
    creator_id = db.Column(db.Integer, db.ForeignKey('users.id')) 
    creator = db.relationship('User', foreign_keys=[creator_id]) 
    created_time = db.Column(db.DateTime(), default=datetime.utcnow) 
    last_modifier_id = db.Column(db.Integer, db.ForeignKey('users.id')) 
    last_modifier = db.relationship('User', foreign_keys=[last_modifier_id]) 
    modified_time = db.Column(db.DateTime(), default=datetime.utcnow) 

class User(db.Model): 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(64), unique=True, index=True) 
    #... 

我views.py文件(是的,这是一个烧瓶应用),那么看起来像:

@posts.route('/data') 
def data(): 

# Column definition for SQLAlchemy-DataTables 
columns = [ 
    ColumnDT(Post.id), 
    ColumnDT(Post.subject), 
    ColumnDT(User.username), # for creator 
    ColumnDT(User.username), # for last modifier... this is the problem 
    ColumnDT(Post.modified_time) 
] 

# Query definition 
query = db.session.query().\ 
    select_from(Post).\ 
    outerjoin(User, Post.creator_id==User.id).\ 
    outerjoin(User, Post.last_modifier_id==User.id) # second error here 

# Request parameters 
params = request.args.to_dict() 

# Instantiating a DataTable for the query and table needed 
rowTable = DataTables(params, query, columns) 

# Returns DataTable JSON 
return jsonify(rowTable.output_result()) 

没有与这两个问题代码,我可以使用指导:

  1. 什么是在查询d中执行相同表之间多个连接的最佳方法efinition?
  2. 如何设置列定义以引用多个关系(creator,last_modifier)的相同数据模型属性(User.username)?

回答

1

为了加入同一个表,则需要aliases多次:

In [9]: creator = db.aliased(User) 

In [10]: last_modifier = db.aliased(User) 

然后定义使用说你列别名:

In [11]: columns = [ 
    ...:  ColumnDT(Post.id), 
    ...:  ColumnDT(Post.subject), 
    ...:  ColumnDT(creator.username), 
    ...:  ColumnDT(last_modifier.username), 
    ...:  ColumnDT(Post.modified_time) 
    ...: ] 
    ...: 

最后,形成查询:

In [12]: query = db.session.query().\ 
    ...:  select_from(Post).\ 
    ...:  outerjoin(creator, Post.creator).\ 
    ...:  outerjoin(last_modifier, Post.last_modifier) 
相关问题