【问题标题】:How can I generate a random value for username in django user model?如何在 django 用户模型中为用户名生成随机值?
【发布时间】:2020-11-21 19:10:15
【问题描述】:

我对 django 默认用户模型很满意,但我希望自动生成用户名。我不想创建自定义用户模型。我需要定义一个生成唯一随机用户名的函数,如下所示:

user = User.objects.create_user(username=generate_username())
def generate_username():
   pass

我不想使用random module生成随机用户名,然后检查它是否存在,否则,创建另一个随机用户名,再次检查等等。

有没有快速的方法来做到这一点?

【问题讨论】:

  • 你关心用户名的格式吗? uuid.uuid1() 几乎可以保证生成唯一值
  • uuid 似乎是要走的路,但是有没有办法将用户名设置为与用户 ID 相同
  • 在保存用户之前无法知道用户id,没有用户名也无法创建用户。
  • 您可以将用户名字段设为主键,这样就没有id 字段了吗?

标签: django database django-models


【解决方案1】:

你可以试试这样的:

import string, random
def generate_username(length):
   username = string.ascii_lowercase #assuming you want only lowercase
   return ''.join(random.choice(username) for i in range(length))

【讨论】:

  • psst...你的意思是username,而不是你的退货声明中的letters?仅供参考 letters 从未定义
  • 我不想用随机模块来做,我需要一种无冲突的方式来做,比如让数据库为我生成它或将它设置为与用户 ID 相同跨度>
【解决方案2】:

MeL 的答案肯定是可行的,但我建议使用这个名为 Faker 的库。它生成实际名称,而不仅仅是随机字符。所以你的代码应该是这样的:

from faker import Faker
fakegen = Faker()

def generate_username(n=5):
    for i in range(n):
        fake.first_name()    # Megan, Katherine, Robert, so on

文档中有更多示例。以上链接。


注意记得运行

pip install faker

在您继续之前。

编辑

为了防止碰撞,我将提交以下更改:

from faker import Faker
fakegen = Faker()

import random

def generate_username():
    # e.g. jonathanfisher2352
    return fake.first_name().lower() + fake.last_name.lower() + random.randint(1000, 9999)

【讨论】:

  • 使用这种方法很有可能发生碰撞
  • 如果图书馆足够大,我认为机会不会很高(但文档中没有提到)。愚蠢的方法(因为它说用户名)是将一个名称与从 1 到 1000 的随机数连接起来 与另一个名称。如果这仍然发生冲突......我无法想象执行了多少操作
  • 我需要一种无碰撞的方式。 random 不保证是唯一的。
  • 知道了就分享一下
  • 你有多少数据?如果你有少于一百万的东西,那么这将有极低的碰撞机会。名字至少有 100 个加上一个 4 位数字,因此您将拥有 100*100*9000 = 9000 万个组合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多