2010-06-22 67 views
2

我想在upload_to呼籲模型類的自我功能等內部:Django的:調用自身功能的Django模型

class Foo(models.Model): 
    filestack = models.FileField(upload_to=self. gen_save_path) 

    def gen_save_path(self): 
     """ 
     gen_save_path: void -> String 
     Generates the path as a string for fileStack field. 
     """ 
     return "some generated string" 

不過我正在NameError: name 'self' is not defined錯誤

回答

-1

我認爲這將如果使用lambda函數,則工作:

class Foo(models.Model): 
    filestack = models.FileField(upload_to=lambda: self.gen_save_path()) 

    def gen_save_path(self): 
     """ 
     gen_save_path: void -> String 
     Generates the path as a string for fileStack field. 
     """ 
     return "some generated string" 
+0

你不能在屬性定義中使用'self'。 'undefined name:self' – jnns 2011-07-03 17:11:57

-1

在您的代碼中,filestack是一個類寬範圍變量,因爲未在方法中定義。 所以在這個範圍內沒有可用的自我。

我認爲你可以使用:

filestack =models.FileField(upload_to=Foo.gen_save_path) 

一個__init__構造,在那裏你可以使用自定義範圍內的值filestack!

+0

我認爲最後一個解決方案是最好的解決方案,在__init__構造函數中定義所有不是類特定的東西 – 2010-06-22 09:17:57

+0

我喜歡這裏的第一個方法,但是如果你需要將'gen_save_path'定義爲類方法去做。 – 2010-06-22 09:26:00

+2

你不能在類中訪問類名,Foo.gen_save_path會給出未定義的錯誤'Foo' – 2010-06-22 09:34:38

3

filestack是一個類屬性,並同時宣佈它沒有課(self)尚未創建的對象,你不能使用自我,根據反正Django的docsupload_to有兩個參數,例如(該模型的實例,其中FileField字段定義)和文件名(最初是考慮到文件)的文件名,所以你可以設置upload_to這樣的功能

def gen_save_path(instance, filename): 
    """ 
    gen_save_path: void -> String 
    Generates the path as a string for fileStack field. 
    """ 
    return "some generated string" 

class Foo(models.Model): 

    filestack = models.FileField(upload_to=gen_save_path) 

如果您希望包括gen_save_path類裏面,你可以使用lambda調用self.gen_save_path例如

class Foo(models.Model): 

    filestack = models.FileField(upload_to=lambda self, fname:self.gen_save_path(fname)) 

    def gen_save_path(self, filename): 
     return "some generated string"