检查SQL中的任何行是否都不匹配

时间:2013-12-19 01:43:54

标签: sql join orm peewee

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)

是否有更优雅的方式做同样的事情?

0 个答案:

没有答案