gpt4 book ai didi

python - 在 Django 中为模型创建 21 个字符的唯一字段

转载 作者:行者123 更新时间:2023-11-30 22:45:11 25 4
gpt4 key购买 nike

我知道 id 本身是唯一的,我想创建一个更长且不易猜测的独特字段。简而言之,该字段将是一个唯一的 21 个字符的字母数字字符串。我使用下面的代码来执行此操作:

class Organization(models.Model):
name = models.CharField(max_length=255)
key = models.CharField(max_length=21, unique=True, blank=True, null=True)

def save(self, *args, **kwargs):
if self.key == '' or self.key == None:
key = ''
for i in range(21):
key += random.choice(string.lowercase + string.uppercase + string.digits)

if Organization.objects.filter(key=key).exists():
self.save() # Try again
else:
self.key = key
super(Organization, self).save(*args, **kwargs)

save 方法中,我执行以下操作:

  • 查看对象的键是否存在。
  • 如果没有,我会生成一个 21 个字符的 key 。
  • 然后,我检查具有我生成的 key 的组织是否存在。
  • 如果不是,则将对象的键设置为生成的键并保存。

这是正确的方法吗?

也许有更好的方法,代码更少?另外,请注意我的关键字段是唯一的,但也可以为空白。这会是一个问题吗?到目前为止,这效果非常好。如有任何帮助,我们将不胜感激。

最佳答案

现在看来您正在尝试使用 CharField 模拟 UUID(通用唯一标识符)。虽然这种方法可能不会引起太多问题(毕竟它确实提供了 (26 + 26 + 10)**21 种可能的组合),但这是一种非常幼稚的方法。

为什么不使用Django原生的UUIDField ?这是一个例子:

class Organization(models.Model):
name = models.CharField(max_length=255)
key = models.UUIDField(default=uuid.uuid4, editable=False)

这将使用 uuid Python 模块。它将生成一个随机 UUID:

In [1]: uuid.uuid4()
Out[1]: UUID('3be0e5db-eb0a-4f09-bda3-37006760ab38')

In [2]: uuid.uuid4()
Out[2]: UUID('8d916804-0a53-478e-8e4f-ebda5d7a69ab')

显然,这些 UUID 是十六进制并包含连字符,但我认为最好遵循此约定,而不是定义您自己的唯一标识符。

关于python - 在 Django 中为模型创建 21 个字符的唯一字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41269244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com