私は、FlaskとSQLAlchemyを使って少し学習管理システムのようなものを開発しています。私はユーザー、コース、課題、提出物を持っています。ユーザーは複数のコースを受講できます。各課題は正確に1つのコースに属します。ユーザーは、自分のコースに関連付けられたすべての課題に対して複数の提出を提出することができます。私は、すでに提出されたすべての投稿をユーザが利用できるすべての課題を表示する関数を作成しようとしています。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クエリで行うことができると信じています。詳細は以下のとおりです。
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
ビュー用のデータを準備
マイモデルspecificionはこのように基本的にあるので
@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)
私はコースのリストを持っており、各コースには含まれてい各割り当てレコードはペアであり、第1の要素は割り当て自体であり、第2の要素は、この割り当ておよびこのユーザに属するサブミッションのリストである。全く優雅ではない。
このロジックをSQLAlchemyクエリで置き換える最も良い方法は何ですか?結合?グループビー?