【问题标题】:Django: Generate unique 8 character alphanumeric ID string on form submissionDjango:在表单提交时生成唯一的 8 个字符的字母数字 ID 字符串
【发布时间】:2016-05-09 17:20:13
【问题描述】:

有人可以帮我在我的模型中创建一个字段,每次用户提交表单时都会生成一个唯一的 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)

我查看了 python 的 UUID 功能,但与我要生成的标识符相比,这些标识符相当长且混乱。

任何帮助将不胜感激!

【问题讨论】:

  • 您希望如何强制执行唯一性?有哪些碰撞风险?

标签: python django forms identifier alphanumeric


【解决方案1】:

类似这样的:

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

【讨论】:

  • 操作员如何在他们的领域使用这个?
  • 这看起来也与this question 的答案非常相似..
  • @ChristoferOhlsson 因为操作不想使用数字
  • @Sayse 当然可以!而且您的单身人士看起来与所有书籍中的一模一样:)
  • @GeorgySavatkow “字母数字”?
【解决方案2】:

为了使 ID 真正唯一,您必须跟踪以前生成的唯一 ID,这可以通过简单的 sqlite DB 轻松完成。

为了生成一个简单的唯一 id,请使用以下行:

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

有关字符串的更多信息,请参阅docs

【讨论】:

    【解决方案3】:

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

    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)
    

    【讨论】:

      【解决方案4】:

      您可以使用 DB id 并将其转换为类似这样的字符串:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-09
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-17
        • 2011-08-14
        相关资源
        最近更新 更多