【问题标题】:UUID as pk in Django overwriting modelsUUID作为Django覆盖模型中的pk
【发布时间】: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/1243stackoverflow.com/questions/15041265/…
  • @DanielRoseman 内置 db 迁移模块不支持 lambdas。因此我无法进行自动迁移。

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


【解决方案1】:

@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 的定义,并且被认为可以很好地处理迁移。我会朝那个方向看。

【讨论】:

    猜你喜欢
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2015-05-21
    • 2010-11-19
    • 1970-01-01
    • 2018-03-07
    • 2018-10-07
    相关资源
    最近更新 更多