4

Django 1.7 现在需要设置迁移。不幸的是,在默认字段值中使用 lambdas 或类似的东西会破坏这个过程。

我在模型中有以下内容:

def make_uuid(type):
    """Takes an entity type identifier string as input and returns a hex of UUID2 with a 
    type identifier pre-pended for readability"""

    return str(type)+str(uuid.uuid1().hex)

class Accounts(models.Model):
    """Model representing Accounts"""

    PENDING_STATUS = 0
    ACTIVE_STATUS = 1
    SUSPENDED_STATUS = 2
    CANCELLED_STATUS = 3
    BETA_STATUS = 4

    STATUS_CHOICES = (
        (PENDING_STATUS, 'Pending'),
        (ACTIVE_STATUS, 'Active'),
        (SUSPENDED_STATUS, 'Suspended'),
        (CANCELLED_STATUS, 'Cancelled'),
        (BETA_STATUS, 'Beta'),
    )

    account_name = models.CharField(max_length=255)
    account_uuid = models.CharField(max_length=34, default=partial(make_uuid,'AC'), db_index=True, unique=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    updated_by = models.ForeignKey(User, null=True, blank=True)
    status = models.IntegerField(max_length=2, choices=STATUS_CHOICES, default=PENDING_STATUS)

调用 partial 会中断迁移过程,并出现以下错误:

ValueError: Cannot serialize: <functools.partial object at 0x10e5cf9f0>
There are some values Django cannot serialize into migration files.

我仍然需要自动生成 UUID,所以有人知道不会破坏迁移的解决方法吗?

4

3 回答 3

7

这里的问题是迁移系统需要序列化函数定义,并且无法使用partial().

(请注意,从 1.9 版开始, Django 实际上能够序列化partial()可调用对象,并且上面的代码可以工作。)

要解决此问题,请改用模块级函数:

def make_uuid_ac():
    return make_uuid('AC')

class Accounts(models.Model):
    ....
    account_uuid = models.CharField(..., default=make_uuid_ac)
于 2014-10-11T06:33:31.583 回答
2

如果您需要将 args 传递给函数(即部分),则docs中有解决方案:

from django.utils.deconstruct import deconstructible

@deconstructible
class MakeUUID(object):
    def __init__(self, pre):
        self.pre = pre

    def __call__(self, obj, *args):
        return '{}-{}-{}'.format(self.pre,
                                 obj.__class__.__name__,
                                 uuid.uuid1().hex)

make_uuid = MakeUUID('AC')

同样type作为参数名称也不是一个好主意。

于 2014-10-11T08:56:45.813 回答
-1

重新阅读文档:<a href="https://docs.djangoproject.com/en/1.8/ref/models/fields/#uuidfield" rel="nofollow">https://docs.djangoproject.com /en/1.8/ref/models/fields/#uuidfield

请注意,可调用(省略括号)传递给默认值,而不是 UUID 的实例。

于 2016-03-18T16:32:09.043 回答