gpt4 book ai didi

python - 如何在 Factory Boy 中使用 lazy_attribute 和 Faker

转载 作者:太空狗 更新时间:2023-10-30 02:39:12 25 4
gpt4 key购买 nike

上下文:我有一个有两个日期的模型,我想对它们都使用 factory.Faker 但第二个日期应该总是大于第一个日期。

我试过这个:

模型摘录:

class Event(models.Model):
execution_start_date = models.DateTimeField()
execution_end_date = models.DateTimeField()

工厂:

class EventFactory(factory.DjangoModelFactory):
class Meta:
model = Event
strategy = factory.BUILD_STRATEGY

execution_start_date = factory.Faker('date_time_this_year', tzinfo=pytz.utc)
@factory.lazy_attribute
def execution_end_date(self):
return factory.Faker('date_time_between_dates',
datetime_start=self.execution_start_date,
datetime_end=now(),
tzinfo=pytz.utc)

但是当我尝试从 python shell 使用工厂时,我得到了这个:

In [3]: e = EventFactory()

In [4]: e.execution_end_date
Out[4]: <factory.faker.Faker at 0x1103f51d0>

我设法让它工作的唯一方法是这样的:

@factory.lazy_attribute
def execution_end_date(self):
# return factory.Faker('date_time_between_dates',
# datetime_start=self.execution_start_date,
# datetime_end=now(),
# tzinfo=pytz.utc)
faker = factory.Faker._get_faker()
return faker.date_time_between_dates(datetime_start=self.execution_start_date,
datetime_end=now(),
tzinfo=pytz.utc)

但老实说,我认为有更好的方法。

我的依赖项是:

  • Django (1.8.18)
  • 工厂男孩 (2.8.1)
  • Faker(0.7.17)

最佳答案

当 lazy_attribute 发挥作用时,您已经生成了对象。因此,您可以像这样使用 random 和 timedelta:

@factory.lazy_attribute
def execution_end_date(self):
max_days = (now() - self.execution_start_date).days
return self.execution_start_date + timedelta(random.randint(1, max_days))

或其他生成随机日期的方法。坚持 factory_boy.Faker 没有意义

编辑

在我的第一个答案之后,我设法找到了一种方法来做你想做的事,这真的很简单。你只需要用来自 Faker 的空字典调用 generate() 方法:

@factory.lazy_attribute
def execution_end_date(self):
return factory.Faker('date_time_between_dates',
datetime_start=self.execution_start_date,
datetime_end=now(),
tzinfo=pytz.utc).generate({})

关于python - 如何在 Factory Boy 中使用 lazy_attribute 和 Faker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45068596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com