You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:22:14