我正在用Flask和SQLAlchemy開發一些類似學習管理系統的東西。我有用戶,課程,作業和提交。用戶可以參加幾門課程。每項任務只屬於一門課程。用戶可以爲與課程相關的每項作業提交多份提交材料。我正在嘗試編寫一個函數,該函數將顯示所有提交已提交的用戶可用的所有分配。輸出頁面的結構是這樣的:在SQLAlchemy中分組
- 課程1
- 分配1
- 提交1(2017年1月4日1點02分03秒)
- 提交2( 2017年1月4日1點03分05秒)
- 作業2
-
所
- 沒有提交尚未
- 分配1
- 課程2
- 作業2
- 提交1(2017年1月4日2點03分10秒)
- 作業2
因此,對於固定用戶,我必須查詢用戶所屬的所有課程,爲每個課程查詢所有分配,併爲每個分配查詢屬於特定用戶的所有提交。
我可以用一些Python代碼來實現,但我相信這可以通過明智的SQLAlchemy查詢來完成。詳情如下。
我的模型specificion基本上是這樣的:
class Course(db.Model):
id = db.Column(db.Integer, primary_key=True)
assignments = db.relationship('Assignment', backref='course',
lazy='dynamic')
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
courses = db.relationship('Course', secondary=courses_users,
backref=db.backref(
'users', lazy='dynamic'))
submissions = db.relationship('Submission', backref=db.backref('user'),
lazy='dynamic')
class Assignment(db.Model):
id = db.Column(db.Integer, primary_key=True)
course_id = db.Column(db.Integer, db.ForeignKey('course.id'))
submissions = db.relationship('Submission', backref='assignment',
lazy='dynamic')
class Submission(db.Model):
id = db.Column(db.Integer, primary_key=True)
assignment_id = db.Column(db.Integer, db.ForeignKey('assignment.id'))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
目前我爲list_assignments
視圖通過以下方式準備數據:
@app.route("/list/assignments")
@login_required
def list_assignments():
submissions = current_user.submissions.all()
courses = current_user.courses
mycourses = []
for course in courses:
mycourse={'id': course.id, 'assignments': []}
for assignment in course.assignments:
mycourse['assignments'].append(
(assignment,
[s for s in submissions if s.assignment == assignment]))
mycourses.append(mycourse)
return render_template("list_assignments.html",
mycourses=mycourses)
所以我的課程列表和每門課程包含分配記錄列表,每個分配記錄是一對,第一個元素是一個分配本身,第二個元素是屬於這個分配和這個用戶的提交列表。不是很優雅。
用SQLAlchemy查詢替換此邏輯的最佳方法是什麼?加入? GROUPBY的?