簡體   English   中英

檢查 Django model 是否存在於數組中

[英]Check if Django model exists in an array

所以,我的數據庫中有一組模型。 現在我制作了一個腳本來 web 從網站上抓取某些項目。 現在我想從我的數據庫中刪除網站中刪除的所有項目。 所以我的意思是,如果我有 web 抓取的項目在我想在我的數據庫中執行相同操作的網站中被刪除。 如何使用循環檢查這一點?

我正在考慮這樣做:

items = ItemModel.objects.all()
for item in items:
  if item.tite not in webscrape_item[0]:
     item.delete

我根據標題進行檢查,如果 web 刮陣列中不存在該標題,則將其刪除。

解決方案

甚至不需要做一個循環,這樣更有效:

ItemModel.objects.exclude(tite__in=webscrape_item[0]).delete()

解釋

讓我們把上面的內容分解一下:如果你想過濾一個查詢集,你通常會這樣做:

ItemModel.objects.filter(some_property=some_value)

但是我們也可以使用.exclude告訴 django 排除什么而不是包含什么。 因此:

ItemModel.objects.exclude(some_property=some_value)

現在,在您的情況下,我們不想僅排除一個tite值,而是排除您列表中的任何值。 對於這個 django 提供__in=這是一種表示“如果值在此列表中”的方式。 以下返回一個查詢集所有要刪除的值:

ItemModel.objects.exclude(tite__in=webscrape_item[0])

但是每個 querySet 都有一個方法delete ,它從數據庫中刪除 queryset 中的所有值。 因此最終的表達式:

ItemModel.objects.exclude(tite__in=webscrape_item[0]).delete()

請注意,如果您為 model 提供了自定義刪除方法,則不一定會調用此方法。 但除此之外,這是 go 比循環更好的方法。

為什么效率更高?

為什么我們不這樣做:

items_to_delete = ItemModel.objects.exclude(tite__in=webscrape_item[0])
for item in items_to_delete:
    item.delete()

上面的循環是對數據庫進行一次訪問以獲取items_to_delete ,然后每次調用item.delete()時都會對數據庫進行一次額外的訪問。 我建議的解決方案將嘗試在單個 SQL 語句中執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM