【发布时间】:2014-07-23 07:43:25
【问题描述】:
这是交易。以这种方式完成时,它起作用了:
class UUIDField(CharField):
def __init__(self, *args, **kwargs):
kwargs['max_length'] = kwargs.get('max_length', 22 )
# kwargs['blank'] = True
kwargs['default'] = lambda: uuid.uuid1().bytes.encode('base64').rstrip('=\n').replace('/', '_')
CharField.__init__(self, *args, **kwargs)
class UUIDModel(models.Model):
uuid = UUIDField(primary_key=True, max_length=22, editable=False)
您可能理解,其余模型继承了UUIDModel,每个人都从此过上幸福的生活。问题是,内置的 Django 迁移设施(以及 South)与 lambdas 不兼容。以下是我尝试解决 lambda 的看法:
class UUIDField(CharField):
def _gen_uuid(self):
return uuid.uuid1().bytes.encode('base64').rstrip('=\n').replace('/', '_')
def __init__(self, *args, **kwargs):
kwargs['max_length'] = kwargs.get('max_length', 22 )
# kwargs['blank'] = True
kwargs['default'] = self._gen_uuid()
CharField.__init__(self, *args, **kwargs)
看起来是合法的,但现在模型被覆盖了,也就是说 UUID 没有改变,每个新模型都被写入同一个 pk。结果,我不能创建多个实例。我哪里做错了? lambda 做什么,我的代码没有?最重要的是,如何解决?
【问题讨论】:
-
似乎你已经通过使用 lambda 修复了它。它有什么问题?
-
首先要注意:lambda 语句生成函数对象,所以在你的第一个代码中
kwargs['default']是一个函数对象(可调用),而在你的第二个例子中你分配函数调用self._gen_uuid(),这意味着kwargs['default']是一个值,而不是函数对象。这就是您的示例之间的区别。这就是为什么每个实例都获得相同的 uuid。至于你原来的问题,请查看:south.aeracode.org/ticket/1243和stackoverflow.com/questions/15041265/…。 -
@DanielRoseman 内置 db 迁移模块不支持 lambdas。因此我无法进行自动迁移。
标签: python django django-models lambda database-migration