2015-08-14 65 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