Django:在表单提交时生成唯一的8个字符的字母数字ID字符串

时间:2016-02-01 09:53:18

标签: python django forms identifier alphanumeric

有人可以帮我在我的模型中创建一个字段,每次用户提交表单时都会生成一个唯一的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功能,但与我想要生成的内容相比,这些标识符非常冗长和混乱。

非常感谢任何帮助!

4 个答案:

答案 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]
    )

如果您可以根据需要调整代码以使用更少或更多的字符。