Django默认数据在迁移期间抛出错误

时间:2017-01-24 22:39:37

标签: django migration

我正在使用Django 1.7

class MyModel(models.Model):

    my_random_field_1 = models.ForeignKey(
        MyOtherModel, null=True, blank=True, related_name="random_1", default=get_random_1
    )

    my_random_field_2 = models.ForeignKey(
        MyOtherModel, null=True, blank=True, related_name="random_2", default=get_random_2
    )

'随机函数':

def get_random_1():
    ob = MyOtherModel.objects.filter(...some filtering...)
    try: 
        x = ob[0]
        return x
    except: 
        return None



def get_random_2():
    ob = MyOtherModel.objects.filter(...some other filtering...)
    try: 
        x = ob[1]
        return x
    except: 
        return None

当我尝试迁移时,我发出了这个错误:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'MyOtherModel'

Sentry正在尝试发送2条待处理的错误消息 等待10秒

但在那之后,当我打开管理面板并转到MyOtherModel时,我有这个随机字段,并且他们正在通过' ob [0]'和' ob [1]'

1 个答案:

答案 0 :(得分:2)

要使此代码有效,您应该将实例主键作为默认值发送,而不是实例本身。

def get_random_1():
    ob = MyOtherModel.objects.filter(...some filtering...)
    try: 
        x = ob[0]
        return x.pk
    except: 
        return None



def get_random_2():
    ob = MyOtherModel.objects.filter(...some other filtering...)
    try: 
        x = ob[1]
        return x.pk
    except: 
        return None

但是请注意,此值将在迁移文件中保持“烘焙”状态,并且迁移时数据库中的所有实例(例如旧数据)将获得单个值,因此这可能不是您的意思万特

较新版本的Django甚至不允许在对象实例中烘焙到迁移文件中这样的事情:D

ValueError: Cannot serialize: <Model: instance name>
There are some values Django cannot serialize into migration files.