2015-09-02 49 views
0

我試圖獲取字段的唯一值(在db列中是唯一的)。調用函數以獲取模型字段值

我的代碼(其它型號省略字段):

class PlatformUserChildren(models.Model): 
    dashboard = models.CharField('dashboard URL', max_length=64, unique=True, default=createDashboardCode(self)) 

    def createDashboardCode(self): 
     stringCheck = False 
     while stringCheck is False: 
      newString = str(uuid.uuid4())[:32] 
      doesStringExist = newString in self.dashboard 
      if not doesStringExist: 
       stringCheck = True 
     return newString 

我得到名「自我」是沒有定義是一個錯誤。

我應該被傳遞給函數,這樣我可以檢查數據庫列,以確保該值是唯一的 - 或者是有這樣做的一個內置的方式嗎?

我已經嘗試過或望着:

  1. 設置unique=True外地和使用default=uuid.uuid4 - 這讓我重複的值,並生成一個驗證錯誤(SO link

  2. 我中號意識到Django 1.8's UUID field,但是我是在1.7

+0

將該字段設置爲unique = True應該注意:https://docs.djangoproject.com/en/1.8/ref/models/fields/#unique – cezar

+0

謝謝cezar - 我已經試過了,它在嘗試保存重複值時會生成驗證錯誤。我想在此之前趕上它。 – AndrewO

+0

是的,文檔也說它會拋出一個IntegrityError。這是在數據庫級完成的。如果您想要捕獲錯誤,則應該將代碼插入try和catch塊中以插入新條目。你能否提供產生錯誤的行(或行)? – cezar

回答

0

的問題就出在弗洛翼前行(縮進可讀性更好),因爲你已經知道了,並提到:

dashboard = models.CharField(
    'dashboard URL', 
    max_length=64, 
    unique=True, 
    default=createDashboardCode(self) 
) 

在這一部分:

default=createDashboardCode(self) 

你調用該方法createDashboardCode的說法self。這是錯誤的,因爲您從不將self傳遞給Python傳遞的方法。每當你調用方法createDashboardCode你應該這樣來做:

createDashboardCode() 

就是這樣,你不及格的說法self明確。

你得到一個錯誤「名稱‘自我’是沒有定義」,因爲self沒有定義。代碼中沒有變量self,您可以將其傳遞給該方法。

現在,我們又進了一步,但如果你只是適用於您的代碼這種輕微的改變,你的問題就不會得到解決。

createDashboardCode將被分配到default的方法的返回值。這不是你真正想要的。你必須對方法的引用賦予default

default = createDashboardCode 

注重缺少的括號內。這將調用的方法每一個模型的一個新的實例被創建

時間定義一個函數:

def my_function(): 
    print "hello" 

,並在Python解釋器中運行:

# once like this 
my_function() 
# and again like this 
my_function 

,你會看到區別。這應該有助於你更好地理解這個問題。

+0

解決了它@cezar - 我的代碼有一些(其他,無關的)問題,但你回答了我的問題。非常感謝 :) – AndrewO