Правильный способ вызвать функцию базы данных из Django? - PullRequest
6 голосов
/ 12 августа 2010

Мне нужно выполнить полнотекстовый поиск с помощью postgresql и django, поэтому я создал функцию search_client(text), которая возвращает список клиентов. Для вызова из БД я использую что-то вроде этого:

SELECT * FROM search_client('something')

и я не совсем уверен, как это назвать от Джанго. я знаю, что могу сделать что-то вроде

cursor = connection.cursor()
cursor.execute("SELECT * FROM search_client('something')")
result = cursor.fetchall()

но это будет только возвращать список значений, и я хотел бы иметь список объектов, например, когда я использую метод filter ().

Есть идеи? спасибо за ваше время!

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

Если ваша цель - полнофункциональная поисковая система, взгляните на django-haystack . Это качается.

Что касается вашего вопроса, новый (Django 1.2) raw метод может работать:

qs = MyModel.objects.raw("SELECT * FROM search_client('something')")
2 голосов
/ 12 августа 2010

Если вы используете Django 1.2, вы можете использовать метод ORM * () * * * * * * * *, чтобы выполнить пользовательский SQL, но вернуть модели Django. Если это не так, вы все равно можете выполнить SQL с помощью метода extra () в QuerySet по умолчанию и вставить его в пользовательский метод, чтобы либо затем извлечь реальные записи ORM, либо создать новые временные объекты

0 голосов
/ 12 августа 2010

Во-первых, вы, вероятно, не хотите этого делать.Есть ли у вас доказательства того, что ваша функция базы данных на самом деле быстрее?

Сначала реализуйте это в Python.Когда вы можете доказать, что ваша реализация Python действительно самая медленная часть вашей транзакции, тогда вы можете попробовать хранимую процедуру.

Во-вторых, у вас есть метод extra, доступный в Django.

http://docs.djangoproject.com/en/1.2/ref/models/querysets/#django.db.models.QuerySet.extra

Обратите внимание, что процедуры обработки базы данных с интенсивными вычислениями часто выполняются медленно.

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