Вот как выглядят мои модели:
EntryGroup(models.Model):
...
EntrySource(models.Model):
entry_group = FK(EntryGroup)
...
Entry(models.Model):
entry_group = FK(EntryGroup)
...
EntryItem(models.Model):
entry = FK(Entry)
attribute_1 = ...
attribute_2 = ...
...
EntryItemCandidate(models.Model):
entry_source = FK(EntrySource)
attribute_1 = ...
attribute_2 = ...
existing_entry_item = FK(EntryItem, null=True)
...
Я пытаюсь получить следующие функциональные возможности:
Получить все объекты из модели EntryItemCandidate с указанным полем entry_source_id (FK EntrySource) и обновите их поле exitsting_entry_item с идентификатором объекта EntryItem, который соответствует следующим критериям:
EntryItem имеет те же значения полей attribute_1 и attribute_2, что и EntryItemCandidate
EntryItem's Entry имеет то же значение поля entry_group (FK EntryGroup), что и EntryItemCandidate в поле EntrySource entry_group (FK EntryGroup)
Если нет EntryItem, отвечающего этим критериям, exitsting_entry_item должен быть установлен в Null.
Раньше я выполнял эту операцию итерацией для каждого EntryItemCandidate, но это был способ замедления (он выполнял бы порядка 10000 запросов для каждой задачи).
Затем мне удалось выполнить эту операцию, используя SQL:
update entry_item_caindidate
set
entry_item_candidate.existing_entry_item = entry_item.id
from
entry_item_candidate
inner join entry_item on
entry_item_candidate.attribute_1 = entry_item.attribute_1
and entry_item_candidate.attribute_2 = entry_item.attribute_2
inner join entry on entry.id = entry_item.entry_id
inner join entry_source on entry_source.id = entry_candidate.entry_source_id
where
entry_source.entry_group_id = entry.entry_group_id
and entry_item_candidate.entry_source_id = {param}
Но так как я ожидаю перехода между несколькими ядрами базы данных, я хотел использовать чистые QuerySets без итерации (запрос выше выиграл ' t работает на sqlite, но работает на MS SQL из-за предложения UPDATE ... FROM).
Возможно ли это?