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