我有一個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
提交
取消