У меня сейчас три таблицы; 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, не то чтобы это имело значение.