在Factory Boy中,如何连接使用Faker创建的字符串?

Phi*_*ord 5 python faker factory-boy

我想用厂男孩其支持法克尔从多个供应商生成的字符串。例如结合prefixname

# models.py
from django.db import models

class Person(models.Model):
    full_name = models.CharField(max_length=255, blank=False, null=False)


# factories.py
import factory

class PersonFactory(factory.Factory):
    class Meta:
        model = models.Person

    full_name = '{} {}'.format(factory.Faker('prefix'), factory.Faker('name'))
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用。例如:

>>> person = PersonFactory()
>>> person.full_name
'<factory.faker.Faker object at 0x7f25f4b09e10> <factory.faker.Faker object at 0x7f25f4ab74d0>'
Run Code Online (Sandbox Code Playgroud)

我想念什么?

Ble*_*der 5

您可以使用(基本未记录)exclude属性来使第一种方法起作用:

class PersonFactory(factory.Factory):
    class Meta:
        model = Person
        exclude = ('prefix', 'name')

    # Excluded
    prefix = factory.Faker('prefix')
    name = factory.Faker('name')

    # Shows up
    full_name = factory.LazyAttribute(lambda p: '{} {}'.format(p.prefix, p.name))
Run Code Online (Sandbox Code Playgroud)

您还可以factory.LazyAttribute直接使用直接使用并一次性生成所有内容faker

from faker import Faker

fake = Faker()

class PersonFactory(factory.Factory):
    class Meta:
        model = Person

    # Shows up
    full_name = factory.LazyAttribute(lambda p: '{} {}'.format(fake.prefix(), fake.name()))
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是您无法轻松访问此人的前缀或姓名。

  • 谢谢!我想也许有一种方法可以使用“factory.LazyAttribute”,但从未设法找到正确的假货组合。 (2认同)
  • 非常好。唯一的疑问是您将以这种方式生成跨性别(按字面意义)的名称。 (2认同)