为了账号安全,请及时绑定邮箱和手机立即绑定

Flask SQL Alchemy 使用 != 列条件查询表

Flask SQL Alchemy 使用 != 列条件查询表

蝴蝶刀刀 2022-12-14 21:06:41
我有一个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


查看完整回答
反对 回复 2022-12-14
?
当年话下

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链接到所有列表。因此它会将所有列表返回给您。


查看完整回答
反对 回复 2022-12-14
  • 2 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号