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

Cha*_*ukh 6 python django factory python-3.x faker

我正在尝试使用工厂和 faker 将数据插入我的数据库(sqlLite3)。

这是我的模型:

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)
Run Code Online (Sandbox Code Playgroud)

型号工厂:

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()
Run Code Online (Sandbox Code Playgroud)

当我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 我想知道为什么会发生这种情况。

我刚开始使用工厂男孩和伪造者。请帮我解决这个问题。如果我遗漏了什么,请告诉我。

小智 1

我认为您必须在类之外添加提供程序,并使用要作为参数运行的函数的名称来声明字段。请参阅下面的示例(来自factoryboy docs)。

发生的情况是,您的代码在声明类时仅运行一次,因此每次仅生成 1 个字符串。

factory.Faker.add_provider(SmileyProvider)

class FaceFactory(factory.Factory):
    class Meta:
        model = Face

    smiley = factory.Faker('smiley')
Run Code Online (Sandbox Code Playgroud)

所以这里SmileyProvider会有一个名为 的方法smiley