2017-10-17 3 views
0

Ich versuche, SQLAlchemy-DataTables zu verwenden, um serverseitige Verarbeitung der Daten für das jQuery DataTables-Plug-in auszuführen, aber ein Problem beim Erstellen des DataTables-Spaltenmodells aufgetreten .Verwenden von SQLAlchemy-DataTables mit mehreren Beziehungen zwischen denselben Tabellen

Meine Datenmodelle in etwa so aussehen:

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) 
    #... 

Meine views.py Datei (ja, das ist eine Anwendung Flask) sieht dann so etwas wie:

@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()) 

Es gibt zwei Probleme mit der Code, den ich Guidance verwenden könnte:

  1. Was ist der beste Weg, um die mehrere Joins zwischen den gleichen Tabellen in der Abfrage d zu tun Definition?
  2. Wie richte ich die Spaltendefinitionen so ein, dass sie auf dasselbe Datenmodellattribut (User.username) für mehrere Beziehungen verweisen (creator, last_modifier)?

Antwort

1

Um die gleiche Tabelle mehrmals Sie aliases müssen sich registrieren:

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

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

Dann definieren Sie Ihre Spalten unter Verwendung der Aliase:

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

schließlich die Abfrage bilden:

In [12]: query = db.session.query().\ 
    ...:  select_from(Post).\ 
    ...:  outerjoin(creator, Post.creator).\ 
    ...:  outerjoin(last_modifier, Post.last_modifier) 
Verwandte Themen