2017-07-12 35 views
2

コンテキスト: 私は2つの日付のモデルを持っていますが、両方ともfactory.Fakerを使用したいのですが、2番目の日付は常に最初の日付より大きくする必要があります。lazy_attributeをFactory Boyの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シェルから工場を使用しようとすると:

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) 

しかし、私は正直なところ、それを行うより良い方法があると思います。

私の依存関係は、以下のとおりです。

  • ジャンゴ(1.8.18)
  • 工場出荷時の少年(2.8.1)
  • 偽物(0.7.17)

答えて

2

ときに来lazy_attributeあなたはすでにあなたの手にオブジェクトを生成しているゲームをプレイします。したがって、ランダムタイデルタなどで、次のように作業できます。

@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)) 

またはランダムな日付を生成する他の方法。私はあなたが欲しいものを行うための方法を発見したために管理私の最初の答えの後EDIT

factory_boy.Faker

に固執する何のポイントはありませんが、それはsimple.Youがちょうど空に()を生成メソッドを呼び出す必要が本当にですFakerからの指示:

@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({}) 
+0

私は両方の図書館の目的が一定の規則に従ってランダムなデータを生成することから、factory-boyとFakerに固執したいと思います。 "もし既に私が持っているなら、ルーチン。さらに、私は、あなたの答えが「または他の方法でランダムな日付を生成する」ことを指摘したいと思います。それはFakerでしょう。 Pythonで日付を扱うときにコーナーケースがたくさんあります。最良の選択肢は、コーナーケース(タイムゾーン処理など)をカバーするライブラリを使用することです。 – diegueus9

+0

@ diegueus9はい、私は数日前に私を理解しています。これを正確に行う方法を見つけました。私は別の解決策で自分の答えを編集する。 –

+0

そうです、2番目のソリューションが動作します – diegueus9

関連する問題