schedule = Session.select()
.join(Activity).join(Course)
.join(StuCouRel)
.join(Student)
.where(Student.id == current_user.id)
.join(StuActIgnore).where(Activity.id != StuActIgnore.activity)
ここで、たとえば StuActIgnore.activity がこのクエリに 3 つの行を持っている場合、「通過」する各セッションは 3 回出力されます。各セッションをStuActIgnore.activity のすべての行と比較します。何が問題なのかはわかっています。私はそれを修正する方法がわかりません。
私はこのようなものが欲しい:
schedule = Session.select()
.join(Activity).join(Course).join(StuCouRel).join(Student)
.where(Student.id == current_user.id)
.join(StuActIgnore)
.where(Activity.id not in StuActIgnore.activity)
あれは; Activity.id がどのStuActIgnore 行とも一致しない場合、セッションがクエリに追加されます。ForeignKeyField は反復可能でないため、私が書いたコードは機能しません。
編集:次のように修正しようとしました:
schedule = Session.select()
.join(Activity)
.join(Course)
.join(StuCouRel)
.join(Student)
.where(Student.id == current_user.id)
.join(StuActIgnore)
.where(Activity not in current_user.ignoredactivities)
この related_name ("ignoredactivities") は反復可能ですが、これも機能しないようです。
EDIT2: 別の for ループを追加して動作させました。動作しますが、効率的でもエレガントでもありません:
ignored = Activity.select().join(StuActIgnore).where(StuActIgnore.student == current_user.id)
for element in schedule:
if element.activity not in ignored:
classes.append(element)
同じことを行うよりエレガントな方法はありますか?