我知道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方法中,我执行以下操作:
这是正确的方法吗?
是否有更好的方法来减少代码呢?另外,注意我的键字段是如何唯一的,但也可以是空白的。这会是个问题吗?到目前为止,这已经相当成功了。任何帮助都是非常感谢的。
发布于 2016-12-21 18:25:28
现在看来,您正在尝试使用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是十六进制的,包含连字符,但我认为最好遵循这个约定,而不是定义您自己的唯一标识符。
发布于 2017-02-15 07:33:16
你可以uuid4。但就我个人而言,我更喜欢CharField,并将uuid4字符指定为默认值。原因是UUIDField在查询DB时会给您带来很多不便。
通过将uuid代码指定为默认值,如下所示,
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)https://stackoverflow.com/questions/41269244
复制相似问题