Factory_boy没有创建不同的用户对象Django

时间:2017-03-10 02:18:31

标签: python django factory-boy

我是Django的Factory_boy新手。花了一些时间后,我了解了如何为用户模型创建工厂。

我使用的是默认用户模型,以下是我的工厂。我正在使用Faker随机性

import factory
from . import models
from django.contrib.auth.models import User
from faker import Faker
from django.contrib.auth.hashers import make_password

fake = Faker()

class UserFactory(factory.DjangoModelFactory):
    class Meta:
        model = User
        django_get_or_create = ('email',)

    first_name = fake.first_name()
    last_name = fake.last_name()
    email = first_name+"."+last_name+"@gmail.com"
    password = make_password("ojasojas")
    username = first_name+"_"+last_name

现在在django shell中

我使用UserFactory.create()来创建一个用户。这很好用。是否可以循环创建语句和crate 5个不同的用户?现在,当我这样做时,我只得到一个用户(一次打包,“得到”四次),如下所示。我错过了什么?enter image description here

2 个答案:

答案 0 :(得分:2)

您正在为工厂定义类属性,只有在定义类时才会对其进行评估。 email = first_name+"."+last_name+"@gmail.com"将被评估一次,而不是每次调用UserFactory.create(),因此会出现唯一约束错误。通常的解决方案是通过__init__()定义实例属性,但FactoryBoy有自己的解决方案:lazy attributes

答案 1 :(得分:0)

这可能不是最好的解决方案,但最近我一直在使用它。我设置了以下全局:

NAMES = [factory.Faker('name')._get_faker().name() for i in range(5)]

在这种情况下,上面会生成一个包含5个假名的列表。

注意:这不保证唯一的名称(因为FuzzyChoice只会从列表中选择一个)。

在您的工厂内:

name = factory.LazyAttribute(lambda obj: factory.fuzzy.FuzzyChoice(NAMES).fuzz())