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 次。它将每个 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)

有没有更优雅的方式来做同样的事情?

4

0 回答 0