Обновите объекты со значениями другой модели, объединенной несколькими столбцами, с дополнительной фильтрацией по их FK, используя Django ORM. - PullRequest
1 голос
/ 17 марта 2020

Вот как выглядят мои модели:

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, который соответствует следующим критериям:

  1. EntryItem имеет те же значения полей attribute_1 и attribute_2, что и EntryItemCandidate

  2. EntryItem's Entry имеет то же значение поля entry_group (FK EntryGroup), что и EntryItemCandidate в поле EntrySource entry_group (FK EntryGroup)

  3. Если нет 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).

Возможно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...