使用SelfAttribute和Faker创建Factory Boy实例时日期解析报错
问题原因
factory.Faker("date")生成的是字符串格式的日期(比如"1984-11-11"),而date_between_dates的date_start参数要求接收datetime.date或datetime.datetime对象,直接传递字符串会触发解析错误。
解决方案
方案一(推荐):直接生成date对象
使用Faker的date_object provider生成原生date类型,既符合dataclass的类型约束,又能被date_between_dates直接识别:
from dataclasses import dataclass from datetime import date import factory @dataclass class DateRange: start: date end: date class DateRangeFactory(factory.Factory): class Meta: model = DateRange start = factory.Faker("date_object") end = factory.Faker("date_between_dates", date_start=factory.SelfAttribute("start")) print(DateRangeFactory())
方案二:字符串转date对象后使用
如果需要保留start的字符串生成逻辑(不推荐,因为dataclass要求date类型),可以通过LazyAttribute先将字符串转为date对象再传递:
from dataclasses import dataclass from datetime import date import factory @dataclass class DateRange: start: date end: date class DateRangeFactory(factory.Factory): class Meta: model = DateRange start = factory.Faker("date") end = factory.LazyAttribute( lambda obj: factory.Faker( "date_between_dates", date_start=date.fromisoformat(obj.start) ).generate({}) ) print(DateRangeFactory())
内容的提问来源于stack exchange,提问作者LondonRob
相关产品推荐
相关产品推荐

