Массовое удаление записей типа "многие-ко-многим"?
Предположим, у меня есть 1000 пользователей, эти пользователи используются в отношении "многие-ко-многим" с "компаниями".
Теперь я хочу удалить всех пользователей, которые "неактивны" (а это большинство) из списка компании.
Есть трюк, который я мог бы использовать с remove
:
for user in User.filter(active=False):
Company.customers.remove(user)
Однако, это будет делать также 1000s обращений к базе данных, что делает его действительно очень медленным. Есть ли способ сделать это в django? Не обращаясь к rawsql?
Удалите элементы в bulk:
Company.customers.remove(*User.objects.filter(active=False))
При этом будет сделано два запроса: один для получения первичных ключей (или полей, на которые ссылается ManyToManyField
) объектов User
, а затем удаление всех этих элементов в bulk.
Если вы хотите сделать это для всех Company
, вы можете использовать:
# 🖟 reference to the Company model
Company.customers.through.objects.filter(user__active=False).delete()
Если мы хотим работать с конкретным Company
, мы также можем ограничить количество запросов немного больше с помощью:
# 🖟 reference to the Company model
Company.customers.through.objects.filter(
company=some_company, user__active=False
).delete()