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在此查询中有三行,那么它将使每个会话“通过”输出三次。它会将每个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行不匹配,则会话将添加到查询中。我写的代码不起作用,因为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)
是否有更优雅的方式做同样的事情?