[英]how to generate unique data in Django using factory and faker?
我正在尝试使用工厂和 faker 将数据插入我的数据库(sqlLite3)。
这是我的 model:
class User(models.Model):
id = models.CharField(max_length=9, primary_key=True)
real_name = models.CharField(max_length=200)
tz = models.CharField(max_length=200)
model 的工厂:
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = User
fake.add_provider(MyProvider)
real_name = factory.Faker('name')
id = ''.join(fake.random_letters(length=9)).upper()
tz = fake.timezone()
当我第一次运行UserFactory.create()
时,添加了 User 但是当我在同一个 python shell 或尝试运行UserFactory.create_batch(5)
第二次运行时,它给了我以下错误:
django.db.utils.IntegrityError: UNIQUE constraint failed: activities_user.id
如果我在不同的终端运行它或从 shell 退出并再次运行相同的命令,它运行良好。
似乎''.join(fake.random_letters(length=9)).upper()
总是返回相同的值。 即使我使用了 random_letters 我想知道为什么会这样。
我不熟悉使用工厂男孩和伪造者。 请帮我解决这个问题。 如果我遗漏了什么,请告诉我。
刚刚找到了解决办法。 这是一件简单的事情! 我已经修改了这一行
id = ''.join(fake.random_letters(length=9)).upper()
至
id = factory.Sequence(lambda n: ''.join(fake.random_elements(elements=(string.ascii_uppercase + string.digits), length=9, unique=True)).upper())
它奏效了!
我认为您必须在 class 之外添加提供程序,并使用您想要作为参数运行的 function 的名称声明字段。 请参阅下面的示例(来自 factoryboy 文档)。
发生的事情是,您的代码在声明 class 时只运行一次,因此每次只产生 1 个字符串。
factory.Faker.add_provider(SmileyProvider)
class FaceFactory(factory.Factory):
class Meta:
model = Face
smiley = factory.Faker('smiley')
所以这里SmileyProvider
会有一个名为smiley
的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.