【问题标题】:In Factory Boy, how to join strings created with Faker?在 Factory Boy 中,如何加入使用 Faker 创建的字符串?
【发布时间】:2018-02-16 09:45:11
【问题描述】:

我想为Faker 使用Factory Boyits support 从多个提供者生成字符串。例如结合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'))

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

>>> person = PersonFactory()
>>> person.full_name
'<factory.faker.Faker object at 0x7f25f4b09e10> <factory.faker.Faker object at 0x7f25f4ab74d0>'

我错过了什么?

【问题讨论】:

  • models.Person 类的字段是什么?这是相关信息。
  • 好的,我不确定它是否有帮助,但我现在已经添加了。
  • @PhilGyford:this 有效吗?您必须创建模型中不存在的prefixname 类属性,然后将它们组合以创建full_name。我不确定这是否会导致错误,因为您原来的 Person 模型没有这些字段。
  • @Blender 谢谢,但我试过了,但由于你建议的原因确实出错了。

标签: python faker factory-boy


【解决方案1】:

您可以使用(基本上未记录的)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.LazyAttribute 有办法,但从未设法找到完全正确的假货组合。
  • 相当不错。唯一的问题是,您将以这种方式生成跨性别(字面意义上的)名称。
猜你喜欢
  • 2020-04-09
  • 2017-12-17
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2019-03-31
  • 2018-05-08
  • 2020-10-24
相关资源
最近更新 更多