Django 1.11用户填充脚本问题求助:姓名重复且单次仅生成1个用户
Django 1.11 数据填充脚本问题排查与修复
我帮你梳理了下这份填充脚本,确实有两处明确的问题导致了你遇到的情况:
问题1:用户名字与姓氏完全相同
你看这段核心代码:
user = User.objects.get_or_create(first_name = fake_last_name,last_name= fake_last_name,email = fake_email)[0]
这里犯了个低级笔误——把first_name的值错写成了fake_last_name,而不是正确的fake_first_name。这样一来,生成的用户的名和姓都会是拆分后的姓氏部分,自然就完全相同了。
问题2:每次仅能填充一个用户
这是因为你用了get_or_create()方法,这个方法的逻辑是先尝试根据给定的条件查询用户,如果不存在再创建新用户。如果Faker生成的信息出现重复(虽然概率不高,但确实可能),或者你的User模型对某些字段有唯一性限制,就会导致后续循环只返回已存在的用户,而不是创建新的。
如果你的需求是生成指定数量的新用户(而不是避免重复),直接用create()方法会更合适;如果你确实需要去重,可以调整get_or_create()的查询条件(比如只根据唯一的email来判断)。
修复后的完整脚本
import os os.environ.setdefault('DJANGO_SETTINGS_MODULE','ProTwo.settings') import django django.setup() from AppTwo.models import User from faker import Faker fakegen = Faker() def populate(N=5): for entry in range(N): # 拆分生成的姓名,获取名和姓 fake_name = fakegen.name().split() fake_first_name = fake_name[0] fake_last_name = fake_name[1] fake_email = fakegen.email() # 修复笔误,使用正确的名和姓;提供两种实现方式供你选择 # 方式1:确保不重复(基于唯一的email判断) user, created = User.objects.get_or_create( email=fake_email, # 用唯一的email作为查询条件 defaults={ 'first_name': fake_first_name, 'last_name': fake_last_name } ) # 方式2:单纯生成新用户,无需去重,直接创建 # user = User.objects.create( # first_name=fake_first_name, # last_name=fake_last_name, # email=fake_email # ) if __name__ == '__main__': print('populating databases') populate(20) print('populated')
额外小提示
如果fakegen.name().split()偶尔出现只有一个部分的情况(比如生成了单字姓名),可能会触发索引错误。可以加个简单的判断处理这种情况:
fake_name = fakegen.name().split() if len(fake_name) >= 2: fake_first_name = fake_name[0] fake_last_name = fake_name[1] else: fake_first_name = fake_name[0] fake_last_name = '' # 或者设置一个默认姓氏比如'Unknown'
内容的提问来源于stack exchange,提问作者Prometheus
相关产品推荐
相关产品推荐

