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

im9ewurl  于 2023-05-08  发布在  Go
关注(0)|答案(5)|浏览(155)

有人能帮我在我的模型中创建一个字段,生成一个唯一的8个字符的字母数字字符串(即用户每次提交表单时都要使用######)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)

我已经看过Python的UUID特性,但这些标识符与我希望生成的标识符相比,既长又乱。
任何帮助将是非常感谢!

sigwle7e

sigwle7e1#

就像这样:

''.join(random.choice(string.ascii_uppercase) for _ in range(8))
a9wyjsp7

a9wyjsp72#

在Django中,您可以通过使用UUIDFieldmax_length=8default=uuid.uuid4为模型创建一个唯一的8字符ID字段。下面是一个如何在Django中定义此字段的示例model.py:

import uuid
from django.db import models
from django.contrib.auth.models import User

class Transfer(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, max_length=8)
    # other fields...

editable=False属性可防止编辑字段,确保值保持唯一。最后,max_length=8确保UUID被截断为8个字符。
请注意,使用UUID作为主键可能有一些缺点,例如与整数主键相比,增加了存储大小和较慢的查询。在决定使用UUID作为主键之前,请仔细考虑您的用例。

cclgggtu

cclgggtu3#

为了使ID真正唯一,您必须跟踪以前生成的唯一ID,这可以通过简单的sqlite DB简单地完成。
要生成一个简单的唯一id,请使用以下行:

import random
import string
u_id = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8))

更多关于字符串的内容可以在文档中找到

jvlzgdj9

jvlzgdj94#

我建议像这样创建一个令牌生成器类:

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)
a64a0gku

a64a0gku5#

您可以使用DB id并使用类似这样的东西将其转换为sting:

def int_to_key(num):
    if num == 0:
        return ""

    return "{0}{1}".format(
        int_to_key(num // 52), 
        '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'[num % 52]
    )

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

相关问题