Ну, насколько я знаю, update_or_create предназначен для использования с одним объектом, а не со многими.
Но внутри него он ищет в БД, если запись существует, и если да, обновляет ее, в противном случае создает новую.
Поскольку create_or_update выполняет два запроса, вы можете выполнить следующие действия без особых накладных расходов:
- Получить все записи, которые уже существуют:
existing_db_partners = set(MyClassB.objects.filter(partner__in=partners).values_list('id', flat=True))
- Теперь создайте два списка: один с существующими партнерами, другой с теми, которые этого не делают:
to_update = [partner
for partner in partners
if partner.id in existing_db_partners]
to_create = [partner
for partner in partners
if partner.id not in existing_db_partners]
- На данный момент это очень просто. Обновите to_update, создайте to_create, используя bulk_create и bulk_update
Я не могу думать ни о чем быстрее
Примечание: это не было проверено.