當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python Django QuerySet.delete用法及代碼示例


本文介紹 django.db.models.query.QuerySet.delete 的用法。

聲明

delete()

QuerySet 中的所有行執行 SQL 刪除查詢,並返回刪除的對象數和包含每個對象類型的刪除數的字典。

delete() 立即應用。您不能在已獲取切片或無法再被過濾的 QuerySet 上調用 delete()

例如,要刪除特定博客中的所有條目:

>>> b = Blog.objects.get(pk=1)

# Delete all the entries belonging to this Blog.
>>> Entry.objects.filter(blog=b).delete()
(4, {'blog.Entry': 2, 'blog.Entry_authors': 2})

默認情況下,Django 的 ForeignKey 模擬 SQL 約束 ON DELETE CASCADE — 換句話說,任何具有指向要刪除對象的外鍵的對象都將與它們一起被刪除。例如:

>>> blogs = Blog.objects.all()

# This will delete all Blogs and all of their Entry objects.
>>> blogs.delete()
(5, {'blog.Blog': 1, 'blog.Entry': 2, 'blog.Entry_authors': 2})

此級聯行為可通過 on_delete 參數自定義到 ForeignKey

delete() 方法執行批量刪除,並且不會在您的模型上調用任何 delete() 方法。但是,它會為所有已刪除對象(包括級聯刪除)發出 pre_delete post_delete 信號。

Django 需要將對象提取到內存中以發送信號和處理級聯。但是,如果沒有級聯也沒有信號,那麽 Django 可能會采用 fast-path 並刪除對象而不提取到內存中。對於大型刪除,這可能會顯著減少內存使用量。執行查詢的數量也可以減少。

ForeignKeys 設置為 on_delete DO_NOTHING 不會阻止刪除 fast-path。

請注意,對象刪除中生成的查詢是可能更改的實現細節。

相關用法


注:本文由純淨天空篩選整理自djangoproject.com大神的英文原創作品 django.db.models.query.QuerySet.delete。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。