2015-08-14 95 views
3

我有一個非常基本的類,它看起來像下面這樣:的Django 1.7遷移無法序列化一個類的方法

class Car(Model): 

    name = CharField(max_length=255, unique=True) 

    @classmethod 
    def create_simple_examples(cls): 
     for c in ['Sedan', 'Coupe', 'Van', 'SUV']: 
      cls.objects.get_or_create(name=c) 

    @classmethod 
    def get_default(cls): 
     c, _ = cls.objects.get_or_create(name='Sedan') 
     return c 

    def __unicode__(self): 
     return self.name 

我試圖將它添加到一個Django應用程序。我有兩個類的方法來1.快速填充表的函數,2.抓住一個經常使用的默認方法。

當我運行

python manage.py makemigrations myapp 

我收到以下錯誤

ValueError: Cannot serialize: <bound method ModelBase.get_default of <class 'crunch.django.myapp.models.Car'>> 

我不太知道爲什麼它試圖序列我get_default功能,這不是真正的表遷移的一部分本身。任何幫助將不勝感激

UPDATE我想我可能已經找到了問題的根源(仍然不知道如何解決,雖然它...)

我有其他類被FKing我新類,默認使用我的默認上面...像這樣的事情

class OtherClass(Model): 

    car = ForeignKey(Car, default=Car.get_default) 

它看起來像遷移正在試圖序列化的功能,因爲這一點。有關如何解決此問題的任何提示?

+0

嘗試移動默認的保存方法,或者你是怎麼得到這個post_save等 – madzohan

+0

工作,最後? –

回答

2

@deconstructible裝飾添加到這對deconstructible一個classmethod

from django.utils.deconstruct import deconstructible 

@deconstructible 
class Car(Model): 
    ... 

更多的文檔可以在這裏找到的類

+0

我有同樣的問題,並用classmethods將這個裝飾器添加到類中,但是當我遷移時Django仍然給出同樣的錯誤...原因是什麼? –

+0

你是否清除過時的pyc文件並重試?我也可以想象下一次發生錯誤的情況。如果沒有看到堆棧跟蹤等將很難推測。 – karthikr

+0

自定義** deconstruct()**方法,請參閱http://stackoverflow.com/questions/31953802/upgrading-from-django-1-6-to- 1-7獲得可調用 - 是 - 不序列化,當運行的 –

2

正如Django's migrations docs中所述,Django可以序列化函數和方法引用(在Python 3中)從類體內使用的未綁定方法,以及其他一些東西,但它不能序列化所有內容。

在這種情況下,因爲您所做get_default一個@classmethodCar.get_default是綁定方法(即,它需要一個隱式引用Car作爲第一個參數),而不是一個普通的函數或方法的參考,並沒有按Django的我不知道該怎麼做。

嘗試使get_default代替@staticmethod,或者創建一個自由函數(頂級函數),調用Car.get_default

+0

使它成爲一個費用站立功能爲我固定它。 – Jared