1
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)

同じことを行うよりエレガントな方法はありますか?

4

0 に答える 0