Python 使用随机值更新实例的有效方法

Python 使用随机值更新实例的有效方法,python,django,Python,Django,我正在将Django与PostgreSQL一起使用,我想知道是否有方法用随机值更新一定数量的模型,这些模型具有uniques字段 我的问题是我需要更新5k的用户,用随机值更改他的电子邮件和用户名。这些字段是唯一的,这意味着两个实例不能具有相同的值。我的逻辑是:对于每个用户,(1)生成随机电子邮件字符串,然后如果没有任何用户使用该电子邮件,则使用该字符串,否则返回到1 Python2.7 Django 1.11,但一切都有帮助 从django.contrib.auth.models导入用户 从dj

我正在将Django与PostgreSQL一起使用,我想知道是否有方法用随机值更新一定数量的模型,这些模型具有uniques字段

我的问题是我需要更新5k的用户,用随机值更改他的电子邮件和用户名。这些字段是唯一的,这意味着两个实例不能具有相同的值。我的逻辑是:对于每个用户,(1)生成随机电子邮件字符串,然后如果没有任何用户使用该电子邮件,则使用该字符串,否则返回到1

Python2.7 Django 1.11,但一切都有帮助 从django.contrib.auth.models导入用户 从django.utils.crypto导入获取\u随机\u字符串 对于user.objects.order_by('-pk')[:5000]。迭代器()中的用户: #生成随机电子邮件 尽管如此: 随机电子邮件=获取随机字符串(10) 如果不是User.objects.filter(email=random_email).exists(): user.email=随机电子邮件 打破 #生成随机用户名 尽管如此: 随机用户名=获取随机字符串(10) 如果不是User.objects.filter(username=random\u username).exists(): user.username=随机用户名 打破 user.save()
IMO,您的实现足够高效。现在,如果您担心对DB的影响太大,也许可以删除
filter().exists()
,并事先生成唯一的字符串列表。像这样:

unique_strings = list(set([get_random_string(10) for x in range(15000)]))  # or use User.objects.all().count()

for x in range(15000 - len(unique_strings)):
   # I tested with 500,000 values, did not get any duplicates so it is highly unlikely to get in this block
   new_str = get_random_string(10)
   if not new_str in unique_strings:
        unique_strings.append(new_str)

for (unique_str, user) in zip(unique_strings, User.objects.all().iterator()):
    user.username = unique_str
    user.email = unique_str
    user.save()

然后,DB命中将从3次减少到1次。

和?有什么问题吗?如果这是一次性的工作,那就不需要支票就去做吧。对于长度为10的字符串,您不太可能命中任何相同的字符串。@MohitC我需要防止冲突,并希望优化DB命中。然后,我想知道是否有更好的方法比我实际做的更少地点击DB。每个循环我至少打3次。5k的用户这相当于15k的连接答案很好,它的DB点击率比原来的解决方案要少,但这不是我想要的。无论如何,我选择它是因为没有其他答案出现。您所做的问题是,我可以拥有一个拥有500万用户的数据库,而我只想对250个用户执行此操作(数字5k实际上是一个变量),因此此解决方案比原始解决方案需要更多的时间和RAM。在后一种情况下,碰撞的几率很低,是的,但并非不存在。