【发布时间】:2016-03-01 22:57:23
【问题描述】:
我正在使用以下内容来生成一组随机的字符和数字:
tag = ''.join([random.choice(string.ascii_letters + string.digits) for n in xrange(36)])
我认为这是一个不错的方法。 36 个字符长度,每个字符是 36 个唯一选项之一。应该是很大的随机性吧?
然后,我使用我认为是唯一的tag 对实例运行查询。结果发现,有 七 (7) 个 条记录具有相同的“随机”tag。所以,我打开了数据库,并运行了一个查询来查看我的标签的可重复性。
事实证明,我的不仅出现了 7 次,而且还有许多标签反复出现。大约有 2000 行,这显然不应该发生。
两个问题:
(1) 我的方法有什么问题,为什么会如此频繁地重复相同的tag?
(2) 为每条记录获取唯一标签的更好方法是什么?
这是我用来将其保存到数据库的代码。虽然它是用 Django 编写的,但显然这不是与 django 相关的问题。
class Note(models.Model):
...
def save(self, *args, **kwargs):
import random
import string
self.tag = ''.join([random.choice(string.ascii_letters + string.digits) for n in xrange(36)])
super(Note, self).save(*args, **kwargs)
【问题讨论】:
-
您的方法看起来不错。我怀疑您在写入数据库时无意中创建了具有相同标签的重复记录。另一种方法是在创建记录之前检查数据库中是否存在标签。
-
尝试使用
uuid而不是random -
感谢您的想法。我将编辑问题以显示我的数据库保存。真的不应该制作多条记录。而且,当我在数据库中看到它们时,这些记录似乎没有联系,也没有按时间或其他任何东西联系起来。
-
接下来,我会将其设为
UniqueField,但这仍然不能解释为什么会发生这种情况。嗯..... -
我只是模拟了 100 次不同的创建 2000 个标签,但在试验中我从未得到任何重复。我并不是说我不相信您的问题,而是问题不在于您生成标签的方式。我认为@gtlambert 的理论是正确的。您是否在其他任何地方保存到数据库?
标签: python django string random django-models