有人可以帮我在我的模型中创建一个字段,每次用户提交表单时都会生成一个唯一的8个字符的字母数字字符串(即A #######)ID吗?
我的 models.py 表格目前如下:
from django.db import models
from django.contrib.auth.models import User
class Transfer(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(User)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
我已经查看过pythons UUID功能,但与我想要生成的内容相比,这些标识符非常冗长和混乱。
非常感谢任何帮助!
答案 0 :(得分:0)
这样的事情:
''.join(random.choice(string.ascii_uppercase) for _ in range(8))
答案 1 :(得分:-1)
为了使ID真正独一无二,您必须跟踪以前生成的唯一ID,这可以通过简单的sqlite DB完成。
要生成简单的唯一ID,请使用以下行:
import random
import string
u_id = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8))
有关字符串的更多信息,请参阅docs
答案 2 :(得分:-1)
我建议像这样创建一个令牌生成器类:
import string, random
class RandomTokenGenerator(object):
def __init__(self, chars=None, random_generator=None):
self.chars = chars or string.ascii_uppercase + string.ascii_lowercase + string.digits
self.random_generator = random_generator or random.SystemRandom()
def make_token(self, n=20):
return ''.join(self.random_generator.choice(self.chars) for _ in range(n))
token_generator = RandomTokenGenerator()
然后在你的模型中应该像:
from django.db import models
from django.contrib.auth.models import User
from .token_utils import token_generator
class Transfer(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(User)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
token = models.CharField(_('UUID'), max_length=8, null=False)
def save(self, *args, **kwargs):
## This to check if it creates a new or updates an old instance
if self.pk is None:
self.token = token_generator.make_token(8)
super(Transfer, self).save(*args, **kwargs)
答案 3 :(得分:-1)
您可以使用数据库ID并使用以下内容将其转换为sting:
def int_to_key(num):
if num == 0:
return ""
return "{0}{1}".format(
int_to_key(num // 52),
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'[num % 52]
)
如果您可以根据需要调整代码以使用更少或更多的字符。