我正在使用Django和PostgreSQL,我想知道是否有一种方法可以用随机值更新一定数量的模型,这些模型具有uniques字段。
我的问题是我需要更新5k的用户,用随机值更改他的电子邮件和用户名。这些字段是唯一的,这意味着两个示例不能具有相同的值。我的逻辑是:对于每个用户,(1)生成随机的电子邮件字符串,然后如果没有任何用户使用该电子邮件,则使用该字符串,否则返回1
# Python2.7 Django 1.11, but everything helps
from django.contrib.auth.models import User
from django.utils.crypto import get_random_string
for user in User.objects.order_by('-pk')[:5000].iterator():
# Generate random email
while True:
random_email = get_random_string(10)
if not User.objects.filter(email=random_email).exists():
user.email = random_email
break
# Generate random username
while True:
random_username = get_random_string(10)
if not User.objects.filter(username=random_username).exists():
user.username = random_username
break
user.save()
字符串
2条答案
按热度按时间lnlaulya1#
IMO,您的实施足够有效。现在,如果您担心过多地访问DB,也许可以删除
filter().exists()
并预先生成唯一字符串列表。就像这样:字符串
然后DB命中将从3次减少到一次。
c2e8gylq2#
你可以使用bulk_update(在Django 2.2中添加)来提高效率。大致上,你把所有修改前的对象放在一个列表中,然后修改示例,然后一次调用
bulk_update
:字符串
一定要阅读Django文档中关于
bulk_update
的内容,因为它有一些限制,比如不能发出信号,不能调用save()
方法等等。