die*_*us9 4 python django django-models faker factory-boy
上下文:我有一个带有两个日期的模型,我想同时使用两个日期,factory.Faker但第二个日期应始终大于第一个日期。
我尝试了这个:
模型摘录:
class Event(models.Model):
execution_start_date = models.DateTimeField()
execution_end_date = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)
厂:
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)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用python shell中的工厂时,得到了以下信息:
In [3]: e = EventFactory()
In [4]: e.execution_end_date
Out[4]: <factory.faker.Faker at 0x1103f51d0>
Run Code Online (Sandbox Code Playgroud)
我设法使其起作用的唯一方法是这样的:
@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)
Run Code Online (Sandbox Code Playgroud)
但老实说,我认为有更好的方法。
我的依赖项是:
当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))
Run Code Online (Sandbox Code Playgroud)
或其他生成随机日期的方式。没有必要坚持到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({})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1475 次 |
| 最近记录: |