Джанго: один-ко-многим запросам - PullRequest
1 голос
/ 08 октября 2011

В моей структуре базы данных много связей один ко многим. Например, у вас есть пользователь, у него много степеней, у него много электронных писем, у него много контрактов и т. Д.

Я узнал об этой функции "select-related ()" в наборе запросов Django, она кажется великолепной. Однако он не идет «назад», он работает только тогда, когда у таблицы, с которой вы начинаете, есть внешние ключи ко всем остальным таблицам, но если это один ко многим, вы не будете хранить все внешние ключи у пользователя. Таблица.

Итак, мой вопрос, есть ли способ, которым я могу,

  1. Хит базы данных один раз
  2. По-прежнему можно использовать красивую объектно-ориентированную модель Django, в идеале что-то вроде user.degree [0] .school_name - это было бы здорово.

Любая помощь будет принята с благодарностью!

Редактировать 1: хм, на самом деле, я только что понял, что технически таблица пользователя НЕ содержит никакой степени имени поля. Единственный способ узнать, что степень связана с пользователем, - это просмотреть таблицу степеней и найти внешние ключи пользователя. Таким образом, в некотором роде это похоже на представление базы данных ...

Редактировать 2: Я полагаю, вы могли бы просто создать представление в базе данных с большим количеством JOIN и создать модель в Django для отражения этого представления, верно? Просто нужно выяснить, как все разные базы данных обрабатывают INSERT / UPDATE / DELETE в представлении ... не уверен, что список есть, я сейчас использую postgresql.

1 Ответ

0 голосов
/ 08 октября 2011

Вы должны взглянуть на django-unjoinify , который позволяет вам использовать собственный настраиваемый оптимизированный SQL и в то же время позволяет сопоставить результат с конкретной моделью.

Если вы беретемаршрут создания представления базы данных (я сам создал много, и я думаю, что это хорошая идея). вам, вероятно, следует переопределить save() delete(), update() модели и аналогичные методы для фактической записи в соответствующие таблицы..

Это действительно классическая база данных: «Запустите один запрос для всего, что вам нужно, а не один запрос на запись».Оба вышеуказанных подхода помогают в достижении этого.

...