我有一个many to many表,正在尝试运行 2 个查询,将其中一个表分成两个列表 - 那些have an item和those that don't.我有一个名为的表items和一个名为lists多对多关系的表。下面显示的函数是项目模型类的一部分。当一个项目 id 被传递到函数中时,它检查所有记录的关联表,然后过滤它自己的值。我编写了一个测试函数,它创建了 4 个列表并向其中两个列表添加了 1 个项目。然后测试调用这两个函数。第一个函数正确返回它添加到的 2 个列表。第二个测试错误地返回所有 4 个列表。这两个函数之间的唯一区别是==vs !=。这意味着我的非平等条件没有触发。Flask搭配使用Flask-SQLAlchemy第一个查询检查equality按预期工作,但not equal查询根本不起作用。我已经尝试过 SQLAlchemy 文档,尝试过使用!=, not_,is not但没有任何运气。谷歌搜索也不会产生任何有用的结果。在 SQLITE3 中这是有效的,这正是我试图用 flask-SQLAlchemy 完成的:select * from Listleft join items_listson items_lists.list_id = List.idWHERE items_lists.item_id is not item.id;这是我的代码,在此先感谢您的指导。def in_list(self): return List.query.join( items_lists, (items_lists.c.list_id == list.id) ).filter( items_lists.c.item_id == self.id ) def not_in_list(self): return List.query.join( items_lists, (items_lists.c.list_id == list.id) ).filter( items_lists.c.item_id != self.id )我正在使用 Python 的 unittest 进行测试 - 这是检查条件的代码。测试失败self.assertEqual(nm1, [l2, l4])而不是看到[l2, l4]结果,我得到[l1,l2,l3,l4]- 根据测试条件,item1 -i1在列表中 -[l1, l3]所以第二个查询条件不起作用。其他不起作用的东西:.filter( items_lists.c.list_id == not_(self.id)) .filter( items_lists.c.list_id == ~self.id) 这将返回一个空列表,而不是让 item 不是成员的两个列表。
2 回答
牛魔王的故事
TA贡献1830条经验 获得超3个赞
我能够通过更改 not_in_lists 函数来调整代码如下。
def not_in_lists(self):
query = List.query.filter(
List.id.notin_(
db.session.query(items_lists.c.list_id).filter(
items_lists.c.item_id == self.id)))
list = []
for i in query:
list.append(i)
return list
当年话下
TA贡献1890条经验 获得超9个赞
将not_in_list函数替换为以下函数。
def not_in_list(self): return List.query.filter(List.id.notin_(session.query(item_lists.c.list_id).filter(item_lists.c.item_id == self.id)))
它不起作用,因为当您在查询中说时!= self.id,它意味着等于其他所有内容,包括第 3 项i3。但是i3链接到所有列表。因此它会将所有列表返回给您。
添加回答
举报
0/150
提交
取消
