2015-06-18 74 views
2

我正在使用PyCharm 4.5.2,Django 1.8.2。Callable not defined for django.db.models field default

如果我定義一個類爲:

class User(models.Model): 
    first_name = models.CharField(max_length=256) 
    last_name = models.CharField(max_length=256) 
    slug = models.SlugField(max_length=256, unique=True, default=make_slug) 

    def make_slug(self): 
     return self.first_name + self.last_name[0] 

IDE高亮顯示default=make_slugmake_slug是不確定的。解釋者同意,當開發服務器嘗試刷新時,它退出狀態1和錯誤NameError: name 'make_slug' is not defined.

因爲它只是一個可調用的名稱,所以我無法傳遞參數。所以,如果我在類之外定義函數(移入更高範圍並被定義),我不能使用類屬性。我看過一些建議使用lambda表達式但從Django documentation這是錯誤的:

注意lambda表達式不能用於諸如默認 領域的選擇,因爲他們不能被遷移序列化。請參閱 文檔瞭解其他注意事項。

定義模型中默認值的可調用方法的正確方法是什麼?

+0

嘗試在屬性之前移動'make_slug'的定義,即剛剛在'first_name = ...'之上# – Pynchia

+0

@Pynchia試過並且另一個問題漸漸出現。 'makemigrations'和'migrate'任務可以工作,但是當我在管理面板中添加一個用戶時,我得到一個'TypeError':'make_slug()缺少1個必需的位置參數:'self''。從方法中刪除'self'參數會取消類屬性,並給出另一個'必須接受一個參數,通常是自我警告。 – ToothlessRebel

+0

好的。你在下面得到了答案。順便說一句:你爲​​什麼重新定義用戶類?考慮使用一對一的關係,它使生活[更簡單](https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#extending-the-existing-user-model)(at至少對我來說) – Pynchia

回答

2

您不應該使用此方法來設置默認值,而不是覆蓋模型的保存方法並在那裏使用它。例如:

class User(models.Model): 
    first_name = models.CharField(max_length=256) 
    last_name = models.CharField(max_length=256) 
    slug = models.SlugField(max_length=256, unique=True, default=uuid.uuid1) 

    def make_slug(self): 
     return self.first_name + self.last_name[0] 

    def save(self, *args, **kwargs): 
     self.slug = self.make_slug() 
     super().save(*args, **kwargs) 
+0

這個工作,但是,文件表明我應該能夠以這種方式使用callable。我希望得到一個解決這個問題的答案,但如果我不在幾天內,我會簡單地接受這一點。謝謝,我不知道'uuid'。 – ToothlessRebel

1

你得到這個錯誤

NameError: name 'make_slug' is not defined.

,因爲你指的make_slug你定義它。如果您將make_slug函數移至slug字段上方,那麼您將不會收到該錯誤。

但是,不可能將任何參數傳遞給您用作默認值的可調用對象,因此這也不起作用。當你嘗試使用模型方法時,你無法繞過這個限制。

如果您需要訪問模型實例來計算默認值,那麼按照ruddra的建議設置save()方法中的值是個不錯的主意。請注意,您可能需要檢查模型是否有主鍵,以便您只在首次創建實例時創建slu g。