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 次。它将每个 Session 与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 行都不匹配,则将 Session 添加到查询中。我写的代码不起作用,因为 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)
有没有更优雅的方式来做同样的事情?