在Django中删除多个对象


105

我需要使用网页从Django的数据库中选择几个要删除的对象。没有可供选择的类别,因此我不能从所有这些类别中删除。我是否必须实现自己的删除表单并在django中对其进行处理,或者django已经有一种方法可以做到这一点?由于其在管理界面中实现。

Answers:


201

您可以删除任何查询集。例如,删除具有某些帖子模型的所有博客帖子

Post.objects.all().delete()

并删除将来发布日期的任何帖子

Post.objects.filter(pub_date__gt=datetime.now()).delete()

但是,您确实需要想出一种方法来缩小QuerySet的范围。如果只希望视图删除特定的对象,请查看Delete通用视图

编辑:

很抱歉对于这个误会。我认为答案介于两者之间。要实现自己的视图,请结合使用ModelForms和通用视图。否则,请研究提供类似功能的第三方应用程序。在一个相关的问题中,推荐为django-filter


1
不,您误解了这个问题。我知道我可以删除所有内容。但是我需要选择要通过网页上的表单删除的对象。然后在我的views.py中处理从表单返回的数据。然后遍历以删除形式返回的内容,因为它遍历数据。但是我想知道在Django中实现此目标的最佳实践是什么。
院长

啊,我的错!我要么使用第三方应用程序,要么将通用视图与一起使用ModelForm
Matt Luongo 2012年

7
@Dean,看看该删除视图。或者,您也可以只写您自己的视图...我的意思是说,最终您可能会收到一个PK列表,并在模型上调用delete ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()并且我确定您要确保随机对象无法删除所有对象通过猜测PK在数据库中找到对象。
Yuji'Tomita'Tomita'2

1
@Dean,很难在不了解更多信息的情况下回答您的问题。您只需要构建一个允许用户选择正确的删除条件的表单(无论是哪种形式-甚至可能是一个输入ID号的输入框……但可能更复杂),然后构建一个响应该视图的视图表单,也许执行验证(权限),然后最终运行该filter(foo).delete()方法。
Yuji'Tomita'Tomita'2

1
该框架不附带的原因之一是@YujiTomita提到的编辑/删除授权和其他复杂性问题。如果您确实需要复杂的过滤,请签出django-filtering并添加一个删除按钮,如果用户被授权,该按钮将调用QuerySet.delete()。
Matt Luongo 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.