我使用Django REST Framework,Django和Postgres作为数据库编写项目。我想在一个查询中批量删除。因此,无需使用纯SQL编写查询就可以吗?
有一个例子,但是执行查询的数量等于一个ID列表的长度(例如,如果在delete_ids
中有2个ID,则Django将执行2个查询):
delete_ids = [...]
MyModel.objects.filter(id__in=delete_ids).delete()
答案 0 :(得分:0)
无法通过原始SQL查询同时使用filter
和delete
。
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()
进行批量删除,但这并不总是可能的,具体取决于数据的逻辑。