2014-09-20 56 views
5

序列化classmethods當我嘗試在Django的1.7運行manage.py makemigrations,我得到以下錯誤:在Django 1.7

ValueError: Cannot serialize: <bound method ModelBase.get_default of <class 'printapp.models.JobConfiguration'>> 
There are some values Django cannot serialize into migration files. 
For more, see https://docs.djangoproject.com/en/dev/topics/migrations/#migration-serializing 

因此,它看起來像有與方法get_default是對JobConfiguration定義,其定義是一個問題重複如下:

@classmethod 
def get_default(cls): 
    result = cls() 
    result.save() 
    return result 

link that was provided in the error message,它看起來像序列化「類引用」是一個支持的功能。

「類參考」與@classmethod相同嗎?

我該如何在「模塊的頂級範圍」中放置「類參考」?

爲什麼必須通過遷移來跟蹤方法?我的假設是遷移是針對數據庫模式的,它只跟蹤存儲的數據類型,而不是類使用的方法類型。

有意思的是:將get_default的定義更改爲靜態方法,下面重複解決了這個問題,但代價是必須對JobConfiguration類名進行硬編碼。

@staticmethod 
def get_default(): 
    result = JobConfiguration() 
    result.save() 
    return result 

(一些上下文:此方法被引用作爲JobConfiguration.get_defaultmodels.OneToOneField(JobConfiguration, default=JobConfiguration.get_default)內與創建用於創建這些字段中的每一個新的JobConfiguration的效果)

+1

出於興趣,這會給你什麼'JobConfiguration.objects.create()'?這仍然是一個命令,幾乎沒有更多的打字。 – 2014-09-20 08:08:47

+0

呵呵,我沒有意識到這種方法是可用的。我可能會在我的代碼中更改它,但我仍然有興趣知道代碼爲什麼會失敗。 – Z1MM32M4N 2014-09-21 09:05:38

回答

0

Migrations are just Python files containing the old definitions of your models - thus, to write them, Django must take the current state of your models and serialize them out into a file.

類方法是結合班上。由於裝飾器封裝了方法,序列化程序面臨着不確定性:綁定器或方法,並且失敗。使用靜態方法不存在這樣的問題,因爲它是附加到類的簡單函數。