繁体   English   中英

如何使用工厂和伪造者在 Django 中生成唯一数据?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM