2013-03-17 111 views
2

有沒有什麼辦法可以設置一個django模型的自動字段ID從 數據庫過程中選擇它的值。例如: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'子句需要數據類型。 – 2013-03-17 19:37:45

+0

@ErwinBrandstetter對不幸的事情感到抱歉。我只是想展示這個問題。我不會再改變它,並感謝下面的答案。 – Bwire 2013-03-19 11:22:02

+0

我相應地回滾到以前的版本。 – 2013-03-19 14:40:46

回答

1

您可以使用任何功能的默認值表達式,包括你自己 - 只要它返回一個合適的數據類型The manual specifies

DEFAULTdefault_expr

DEFAULT子句指定用於其列定義,它出現的字段缺省數據值。該值爲任何 無變量表達式(不允許對當前表中的其他 列進行子查詢和交叉引用)。 默認表達式的數據類型必須與列的數據類型相匹配。

大膽重視我的。
但是,您顯示的功能是觸發功能(RETURNS trigger),並且不能使用

如果函數返回varchar或任何其他可以強制轉換爲列類型的類型,則可以使用它。應該簡單地在Django中是default=myfunc()。它是SQL的CREATE TABLE中的DEFAULT myfunc()。包括括號,在我的示例中爲沒有參數的函數清空。

+0

謝謝歐文。所以對於數據庫中的過程,我如何將它設置爲從過程中選擇默認值?我試圖避免兩次去數據庫。 – Bwire 2013-03-17 17:52:37

+0

@Bwire:考慮我的答案附錄。 – 2013-03-17 18:00:28

+0

@Bwire:那是否解決了你的問題? – 2013-03-19 21:16:16

0

爲什麼不按照你的意願使用?

Default值可能是可調用的對象。因此,在一個函數中,你可以轉向數據庫並做一些事情。

另外signals可能會對您有所幫助。

+0

因爲這是一個觸發器功能。 – 2013-03-17 17:51:27