Массовое удаление записей типа "многие-ко-многим"?

Предположим, у меня есть 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()
Вернуться на верх