Создание декартового произведения с помощью Django ORM - PullRequest
0 голосов
/ 27 августа 2018

У меня сейчас три таблицы; Person, Item и таблица отображения многих ко многим, называемая PersonItems.

Я хочу вывести таблицу HTML всех Person с в левом столбце, тогда заголовок таблицы будет Item с. Человек может иметь или не иметь предмет на основе записи в таблице PersonItems, которую я укажу в соответствующей ячейке.

В конечном итоге я получу вывод таблицы HTML из шаблона Django, содержащего Person, умноженный на элементы Item 'td'. Может быть до 5000 человек, но только около 30 предметов.

Я стремился создать эту таблицу, создав декартову от Person до Item, и для каждой комбинации проверяя, есть ли запись в таблице PersonItem.

У меня проблема с созданием декартового произведения таблицы Person и Items, которая затем соединяется с PersonItems. Единственный способ сделать это без SQL - это выполнить итерацию всех Person с, и для каждого человека выполнить запрос, чтобы проверить, есть ли у этого человека элемент. Однако такой подход немного медленнее, чем использование необработанного SQL-запроса.

Я экспериментировал с функцией iteritems.product, чтобы создать начальный декартов, т. Е.

product(Person.objects.all(), Item.objects.all())

затем повторяем это, чтобы проверить, существует ли соответствующая запись PersonItem, однако она заметно медленнее на внешнем интерфейсе.

Я не особенно хочу вставлять большой SQL-запрос в мое представление Django, я новичок в Django, и, похоже, это не лучшее направление. Если это невозможно сделать с помощью Django ORM и / или Python, я просто придерживаюсь SQL, т.е. примерно следующий запрос (обратите внимание на декартовый подзапрос).

SELECT something,something,something
FROM (SELECT p.id as person_id, i.id as item_id, etc, etc, etc
      FROM Person p, Item i) x
LEFT JOIN person_item pi ON x.person_id = pi.person_id AND x.event_id = pi.event_id

Кстати, база данных - это MySQL, не то чтобы это имело значение.

...