2

我正在尝试获取以下查询:

ignored = Activity.select().join(StuActIgnore).join(Student).where(Student.id == current_user.id)
Activity.select().where(~(Activity.name**"%BBP") & Activity not in ignored)

这不会给我任何错误,但会出现以下任何错误:

Activity.get(~(Activity.name**"%BBP") & Activity not in ignored)
Activity.select().where(~(Activity.name**"%BBP") & Activity not in ignored).join(Course)

给我以下错误:

AttributeError: 'bool' object has no attribute 'clone'

如果我试试这个:

Activity.select().join(Course).join(StuCouRel).join(Student).where(~(Activity.name**"%BBP") & Activity not in ignored & Student.id == current_user.id)

它会告诉我:

    TypeError: argument of type 'Expression' is not iterable

我觉得这很令人困惑,因为:

already_selected = Course.select().join(StuCouRel).join(Student).where(Student.id == current_user.id)
to_choose = Course.select().where(Course not in already_selected)

工作得很好,虽然它看起来非常类似于我正在尝试做的事情。

我完全不知道这可能意味着什么,我在文档中找不到任何东西。'bool' 对象可能代表布尔值,但我看不到我的查询结果是布尔值。我也不知道“克隆”是什么意思,也不知道如何解决这个错误。

4

1 回答 1

2

Python 将任何__contains__()返回的值转换为布尔值。这就是为什么在构建 peewee 查询时不能使用“not in”或“in”的原因。您改为使用<<表示“IN”。

你可以试试:

ignored = (Activity
           .select()
           .join(StuActIgnore)
           .join(Student)
           .where(Student.id == current_user.id))
Activity.select().where(~(Activity.name**"%BBP") & ~(Activity.id << ignored))

请参阅有关查询的文档以获取更多信息http://peewee.readthedocs.org/en/latest/peewee/querying.html#column-lookups

于 2013-12-20T00:08:15.943 回答