Удалить несколько объектов Django через ORM - PullRequest
1 голос
/ 16 октября 2019

Можно ли удалить много экземпляров модели, не повторяя их и не вызывая .delete() для каждого?

Допустим, у нас есть что-то вроде этого:

objects = [o for o in MyObject.objects.filter(...)]

objects_to_delete = get_validate_objects(objects) # some of objects from objects

А теперь яхотите удалить каждые MyObject в objects_to_delete. Есть ли способ лучше / умнее, чем этот?

1010

Также я хочу быть уверен, что все объекты были удалены. Исключение / сообщение о проблеме при удалении объекта (ранее удаленного) будет хорошим.

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Вы можете удалить queryset ;чтобы получить набор запросов, содержащий объекты, которые у вас есть в списке, вы можете сделать:

objects_to_delete = MyObject.objects.filter(pk__in=[o.pk for o in objects])
objects_to_delete.delete()

Но в идеале вы должны написать «get_validate_objects» таким образом, чтобы он принимал набор запросов в качестве параметра и выполнял все свои проверкинабор запросов (с использованием filter (), exclude () и т. п.). Тогда вы можете немедленно вызвать .delete () для результата. Но это не всегда легко, конечно.

0 голосов
/ 16 октября 2019

Поскольку у вас есть объекты в objects_to_delete, вы можете получить идентификаторы этих объектов и удалить их. Сделайте что-то вроде:

MyObject.objects.filter(id__in=[i.id for i in objects_to_delete]).delete()

Это приведет к следующему SQL.

DELETE FROM MyObject WHERE id IN (ids of objects)

Например, если идентификаторы удаляемых объектов - 1,2, 3, 4,5 тогда sql будет:

DELETE FROM MyObject WHERE id IN (1, 2, 3, 4, 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...