首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Django中的模型创建一个21个字符的唯一字段

问为Django中的模型创建一个21个字符的唯一字段
EN

Stack Overflow用户
提问于 2016-12-21 18:10:47
回答 2查看 1.4K关注 0票数 1

我知道id本身是独一无二的,我想要创建一个更长更不容易猜到的唯一字段。简而言之,这个字段将是一个独特的,21个字符的字母数字字符串。我使用下面的代码来完成此操作:

代码语言:javascript
复制
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个字符键。
  • 然后,我检查使用我生成的密钥的组织是否存在。
  • 如果没有,则将对象的键设置为生成的键并保存。

这是正确的方法吗?

是否有更好的方法来减少代码呢?另外,注意我的键字段是如何唯一的,但也可以是空白的。这会是个问题吗?到目前为止,这已经相当成功了。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-21 18:25:28

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

为什么不使用Django的本地UUIDField呢?下面是一个示例:

代码语言:javascript
复制
class Organization(models.Model):
    name = models.CharField(max_length=255)
    key = models.UUIDField(default=uuid.uuid4, editable=False)

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

代码语言:javascript
复制
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是十六进制的,包含连字符,但我认为最好遵循这个约定,而不是定义您自己的唯一标识符。

票数 5
EN

Stack Overflow用户

发布于 2017-02-15 07:33:16

你可以uuid4。但就我个人而言,我更喜欢CharField,并将uuid4字符指定为默认值。原因是UUIDField在查询DB时会给您带来很多不便。

  • 如果您想在以pythonic方式生成UUID代码之后添加行(通过插入原始DB命令),那么如果您试图遍历DJANGO-QUERIED对象,它会给您带来一些问题。

通过将uuid代码指定为默认值,如下所示,

代码语言:javascript
复制
from django.db import models
import uuid

class Person(models.Model):

    name = models.CharField(max_length=255)
    code = models.CharField(max_length=8, unique=True, default=uuid.uuid4)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41269244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档