按ID批量删除Django

时间:2018-08-16 14:27:38

标签: django django-models django-rest-framework django-orm

我使用Django REST Framework,Django和Postgres作为数据库编写项目。我想在一个查询中批量删除。因此,无需使用纯SQL编写查询就可以吗? 有一个例子,但是执行查询的数量等于一个ID列表的长度(例如,如果在delete_ids中有2个ID,则Django将执行2个查询):

delete_ids = [...]
MyModel.objects.filter(id__in=delete_ids).delete()

2 个答案:

答案 0 :(得分:0)

无法通过原始SQL查询同时使用filterdelete

https://docs.djangoproject.com/en/2.1/topics/db/sql/

 MyModel.objects.raw('DELETE FROM my_model WHERE id IN (%s)', [','.join([list_of_ids])])

对于快速删除没有建议,但您也可以使用

 sql.DeleteQuery(MyModel).delete_qs(qs, using=qs.db)

答案 1 :(得分:0)

jackotyne的答案不正确,因为DELETE语句无法与django raw一起运行。 django raw背后的想法是它返回一个查询集,但是DELETE不会这样做。

请阅读对此answer的回复。
您将需要一个django documentation中所述的数据库游标。

with connection.cursor() as cursor:
    cursor.execute(
        'DELETE FROM "appname_modelname" WHERE id IN (%s)' % ', '.join(delete_ids)
    )

当然最好使用django进行过滤并获取一个查询集并使用queryset.delete()进行批量删除,但这并不总是可能的,具体取决于数据的逻辑。