这是合约。当这样做时它起作用了:
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做了什么,我的代码没有?最重要的是,它是如何修复的?
答案 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
的定义,并且它被认为适用于迁移。我正朝这个方向看。