Custom sql для модели Django - PullRequest
       3

Custom sql для модели Django

1 голос
/ 12 января 2012

Немного предыстории ...

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

сообщение в блоге Скотта Барнхэма

По какой-то причине ORM генерирует недопустимый sql.Кажется, что он хочет выполнить внутреннее объединение обратно к себе, и это не удается, потому что он не может найти поле с именем user_ptr_id для объединения.

Если вы выполните поиск, кажется, что я не могуединственный.И есть ссылка на это в комментарии к сообщению в блоге выше.Но я не могу это исправить.

Кажется, я должен иметь возможность переопределить генерируемый SQL.Это верно?Из того, что я могу сказать, похоже, что я мог бы сделать это с помощью собственного диспетчера объектов.Правильный?

Однако я не могу найти хороший пример того, что я хочу сделать.Все, что я вижу, хочет наследовать и связывать их.Это не совсем то, что я хочу сделать.Я просто хочу сказать что-то вроде:

Эй, Джанго!на выбор, используйте этот оператор SQL.etc

Возможно ли это?Может быть, мой "гуглин" сегодня выключен, но я не могу его найти.Это наводит меня на мысль, что я использую неправильные термины или что-то в этом роде.

Обратите внимание: я использую Django 1.3.1 с Python 2.6.5 и PostgreSQL 9.1

1 Ответ

0 голосов
/ 12 января 2012

David

Да, вы можете переопределить поведение модели, внедрив переопределенный Менеджер в объект. Я нашел отличный блог Грега Алларда о Диспетчере моделей Django для мягкого удаления записей , который проходит через мягкое удаление, чтобы установить для поля deleted значение True / False и показывать только объекты, которые не были удалены, или все с удаленными объектами.

Имея это в виду, я думаю, что вы можете переопределить методы all () или filter () вашего объекта, чтобы получить то, что вы хотите. Кроме того, каждый раз, когда я использовал указатель, «ptr» очевидно в названии поля, это связано с наследованием класса. Например, class Animal():..., class Man(Animal): Человек расширяет или является подклассом Animal. В базе данных таблица Man будет иметь animal_ptr_id, который «расширяет» кортеж таблицы животных с таким идентификатором, как Man с полями ANIMAL и полями MAN JOINed.

...