在Django中删除多个对象
在Django中,我们可以删除任何想要删除的QuerySet。比如,要删除所有具有某个Post模型的博客文章:
Post.objects.all().delete()
要删除任何具有未来发布日期的Post:
Post.objects.filter(pub_date__gt=datetime.now()).delete()
但是,你需要找到一种方法来缩小你的QuerySet范围。如果你只想删除特定的对象,可以查看delete generic view。
编辑:
对于这个问题的误解很抱歉。我认为答案应该介于两者之间。要实现自己的方法,可以结合ModelForm
和generic views。或者,可以使用提供类似功能的第三方应用程序。在相关问题中,建议使用django-filter。
不,你误解了问题。我知道我可以删除所有东西。但是我需要通过网页上的表单选择要删除的对象。然后在我的views.py中处理从表单返回的数据。然后循环遍历从表单返回的数据,并在循环过程中删除数据。但是我想知道在Django中实现这个的最佳实践是什么。
哦,我弄错了!我要么使用第三方应用程序,要么使用带有ModelForm
的generic views。可以看看那个delete view。或者你也可以编写自己的view...我的意思是,最终你可能会收到一个PK列表,并在你的模型上调用delete...MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()
,我相信你希望有一些方法来确保一个随机的人不能通过猜测PK来删除数据库中的所有对象。
你能写得更详细一点吗?因为那正是回答我问题的东西。
很难在不了解更多细节的情况下回答你的问题。你只需要构建一个表单,允许用户选择正确的删除条件(无论是什么 - 也许甚至是一个输入框,用户在其中输入一个ID号码...但可能更复杂一些),构建一个响应该表单的view,可能进行验证(权限),然后最后运行那个filter(foo).delete()
方法。
这个框架没有自带的原因之一是编辑/删除的授权问题和其他复杂性。如果你确实需要复杂的过滤,请查看django-filtering,并添加一个调用QuerySet.delete()的删除按钮,如果用户有权限的话。