猿问

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

我有一个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 List

left join items_lists

on items_lists.list_id = List.id

WHERE 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 不是成员的两个列表。


蝴蝶刀刀
浏览 204回答 2
2回答

牛魔王的故事

我能够通过更改 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

当年话下

将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链接到所有列表。因此它会将所有列表返回给您。
随时随地看视频慕课网APP

相关分类

Python
我要回答