在 Factory Boy 中,如何连接使用 Faker 创建的字符串?
In Factory Boy, how to join strings created with Faker?
我想使用 Factory Boy and its support for Faker 从多个提供商生成字符串。例如结合 prefix
和 name
:
# 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'))
但这似乎不起作用。例如:
>>> person = PersonFactory()
>>> person.full_name
'<factory.faker.Faker object at 0x7f25f4b09e10> <factory.faker.Faker object at 0x7f25f4ab74d0>'
我错过了什么?
您可以使用(基本上未记录的)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))
你也可以直接用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()))
这种方法的缺点是您无法轻松访问此人的前缀或姓名。
我想使用 Factory Boy and its support for Faker 从多个提供商生成字符串。例如结合 prefix
和 name
:
# 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'))
但这似乎不起作用。例如:
>>> person = PersonFactory()
>>> person.full_name
'<factory.faker.Faker object at 0x7f25f4b09e10> <factory.faker.Faker object at 0x7f25f4ab74d0>'
我错过了什么?
您可以使用(基本上未记录的)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))
你也可以直接用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()))
这种方法的缺点是您无法轻松访问此人的前缀或姓名。