2017-10-17 54 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) 
相關問題