Python Flask SQL Alchemy查询带有!=列条件 编辑-这就是我的工作解决方案

Python Flask SQL Alchemy查询带有!=列条件 编辑-这就是我的工作解决方案,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,多亏了下面的答案,我能够通过更改not_in_list函数对代码进行如下调整 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)))

多亏了下面的答案,我能够通过更改not_in_list函数对代码进行如下调整

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
原职 我的问题似乎与:,但似乎无法用那里的信息来理解。也许有人能帮忙

我有一个
many-to-many
表,正在尝试运行两个查询,将其中一个表分为两个列表-那些
有一个项目的列表和那些没有项目的列表

我有一个名为
items
的表和一个名为
lists
的表,它们具有多对多关系。下面显示的函数是item model类的一部分。当一个项目id被传递到函数中时,它会检查关联表中的所有记录,然后过滤它自己的值。我编写了一个测试函数,创建了4个列表,并在其中两个列表中添加了1项

然后,测试调用这两个函数。第一个函数正确返回它添加到的2个列表。第二个测试错误地返回所有4个列表。这两个函数之间的唯一区别是
==
=。这意味着我的不平等状态不会被触发

使用
Flask
Flask-SQLAlchemy

第一个查询检查
相等
按预期工作,但
不相等
查询根本不工作

我试过SQLAlchemy文档,试过使用
=
,但运气不好

谷歌搜索也不会产生任何有用的结果

在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]
,因此第二个查询条件不起作用

def test_show_members(self):
        i1 = Item(text = "this is an item")
        i2 = Item(text = "This is a second item")
        i3 = Item(text = "This is a third item")
        i4 = Item(text = "This is a fourth item")


        l1 = List(title = "Canaries")
        l2 = List(title = "Bluejays")
        l3 = List(title = "Crows")
        l4 = List(title = "Ravens")

        db.session.add_all([i1,i2,i3,i4,l1, l2,l3,l4])
        db.session.commit()

        #i1 in 2 lists - Canaries + Crows
        i1.AddToList(l1)
        i1.AddToList(l3)
        
        #i2 in 1 list - Bluejays
        i2.AddToList(l2)
        
        #i3 in all lists - Canaries, Bluejays, Crows, Ravens
        i3.AddToList(l1)
        i3.AddToList(l2)
        i3.AddToList(l3)
        i3.AddToList(l4)
        #i4 not in any lists

        db.session.commit()

        m1 = i1.in_lists().all()
        m2 = i2.in_lists().all()
        m3 = i3.in_lists().all()
        m4 = i4.in_lists().all()

        nm1 = i1.not_in_lists().all()
        nm2 = i2.not_in_lists().all()
        nm3 = i3.not_in_lists().all()
        nm4 = i4.not_in_lists().all()  

        self.assertEqual(m1, [l1, l3])
        self.assertEqual(nm1, [l2, l4])
        
        self.assertEqual(m2, [l2])
        self.assertEqual(nm2, [l1, l3, l4])
        
        self.assertEqual(m3, [l1, l2, l3, l4])
        self.assertEqual(nm3, [])
       
        self.assertEqual(m4, [])
        self.assertEqual(nm4, [l1, l2, l3, l4])

其他不起作用的事情:

.filter(
   items_lists.c.list_id == not_(self.id)
) 

.filter(
   items_lists.c.list_id == ~self.id
) 

这将返回一个空列表,而不是项不是成员的两个列表。

用下面的函数替换
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
链接到所有列表。因此,它会将所有列表返回给您。

请给出详细信息。现在还不清楚这段代码到底在做什么。什么是
列表
?什么是
项目列表
?您是否验证了数据库中存在值,其中
items\u list.c.item\u id!=self.id
应该给出结果吗?您是否在第二个函数中尝试了子查询?@roganjosh太长,无法键入注释。添加了问题的更新。“这能把事情弄清楚吗?”DaniloMoura没有。一般来说,我对dev是相当陌生的。我在这里做不到的子查询能做什么?嘿,我试过了,但遇到了问题。项目列表是一个关联表,根据FlaskSqlAlchemy文档,它是一个
db.table
而不是
db.Model
。正在尝试运行
items\u lists.query(
给我一个AttributeError:“Table”对象没有属性“query”@RostislavRoznoshchik请立即尝试。我进行了编辑。我还没有完全测试过这一点,但它可以解决。查询本身应该可以工作。这很有效!尽管我不得不在之后添加一个额外的步骤。您的查询返回了
AssertionError:!=[,]
然后我需要将其更改如下:
query=[your query]list=[]对于查询中的项目:list.append(item)return list