2013-03-17 3 views
2

Есть ли способ установить идентификатор автоматического поля модели django, чтобы выбрать его значение из процедуры базы данных. например:django получить значение по умолчанию из хранимой процедуры базы данных

class Service(models.Model): 

id = models.CharField(max_length=50, primary_key=True, default=database_procedure) 
name = models.CharField(max_length=50) 
icon = models.CharField(max_length=150, default='iconset-info.png') 
description = models.TextField() 

и процедура базы данных что-то вроде:

CREATE FUNCTION database_procedure() RETURNS trigger AS $database_procedure$ 
    BEGIN 
     [...] 
    END; 
$database_procedure$ LANGUAGE plpgsql; 
+0

Ваше обновление вопроса существенно изменило его, и мой ответ казался частично OT. * Пожалуйста, не делайте этого. * Кроме того, определение вашей функции теперь является синтаксической бессмыслицей, так как в предложении 'RETURNS' требуется тип данных. –

+0

@ErwinBrandstetter извините за неудачу. Я только хотел показать этот вопрос. Я не буду менять его снова и оцениваю ваш ответ ниже. – Bwire

+0

Я вернулась к предыдущей версии соответственно. –

ответ

1

Вы можете использовать любую функцию в выражении значение по умолчанию, в том числе собственных - до тех пор, как она возвращает соответствующий тип данных. The manual specifies:

DEFAULTdefault_expr

DEFAULT Предложение присваивает значение данных по умолчанию для столбца, столбец определение оказывается внутри. Значение представляет собой любое выражение без переменных (подзапросы и перекрестные ссылки на другие столбцы в текущей таблице недопустимы). Тип данных выражения по умолчанию должен соответствовать типу данных столбца.

Смелый акцент мой.
Но функция, которую вы показываете, является функцией триггера (RETURNS trigger) и не может использовать.

Если ваша функция возвращает varchar или любой другой тип, который можно принуждать к типу столбца, вы можете его использовать. Должно просто быть default=myfunc() в Django. Это DEFAULT myfunc() в CREATE TABLE SQL. Включая круглые скобки, пустые в моем примере для функции без параметров.

+0

Спасибо Эрвин. поэтому для процедуры из базы данных, как мне установить ее для выбора значения по умолчанию из процедуры? Я стараюсь не обращаться к базе данных дважды. – Bwire

+0

@Bwire: Рассмотрим добавление к моему ответу. –

+0

@Bwire: Так это решило вашу проблему? –

0

Почему бы не использовать так, как вы хотите?

Default Значение может быть подлежащим вызову объектом. Поэтому в функции вы можете обратиться к базе данных и сделать что-то.

Также signals может быть вам полезен.

+0

Потому что это функция триггера. –

Смежные вопросы