UUID作为Django中的pk覆盖模型

时间:2014-07-23 07:43:26

标签: python django django-models lambda database-migration

这是合约。当这样做时它起作用了:

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迁移设施(以及南方)与lambda不匹配。以下是我尝试解决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做了什么,我的代码没有?最重要的是,它是如何修复的?

1 个答案:

答案 0 :(得分:0)

@pavel_form的评论帮助我理解了问题的根源。传递可调用似乎已经解决了:

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)
但是,它仍然会导致公平分享迁移问题。 South migrate error: name 'UUID' is not defined(由@ pavel-form建议)更进一步,省略了特殊UUIDFIeld的定义,并且它被认为适用于迁移。我正朝这个方向看。