首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么django-q抛出带有箭头时间的异常

为什么django-q抛出带有箭头时间的异常
EN

Stack Overflow用户
提问于 2021-05-07 16:51:32
回答 1查看 104关注 0票数 0

我正在尝试创建一个Django-q时间表,并按照文档在下一次运行中使用arrow,我得到了关于时间表的以下错误:

代码语言:javascript
复制
schedule(
        func='test.tasks.test_task',
        name='test_task_nightly',
        schedule_type=Schedule.DAILY,
        next_run=arrow.utcnow().replace(hour=23, minute=30),
        q_options={'timeout': 10800, 'max_attempts': 1},
    )
代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/lib/python3.8/code.py", line 90, in runcode
    exec(code, self.locals)
  File "<console>", line 1, in <module>
    schedule(
  File "/home/user/PycharmProjects/app/venv/lib/python3.8/site-packages/django_q/tasks.py", line 122, in schedule
    s.full_clean()
  File "/home/user/PycharmProjects/app/venv/lib/python3.8/site-packages/django/db/models/base.py", line 1209, in full_clean
    self.clean_fields(exclude=exclude)
  File "/home/user/PycharmProjects/app/venv/lib/python3.8/site-packages/django/db/models/base.py", line 1251, in clean_fields
    setattr(self, f.attname, f.clean(raw_value, self))
  File "/home/user/PycharmProjects/app/venv/lib/python3.8/site-packages/django/db/models/fields/__init__.py", line 650, in clean
    value = self.to_python(value)
  File "/home/user/PycharmProjects/app/venv/lib/python3.8/site-packages/django/db/models/fields/__init__.py", line 1318, in to_python
    parsed = parse_datetime(value)
  File "/home/user/PycharmProjects/app/venv/lib/python3.8/site-packages/django/utils/dateparse.py", line 107, in parse_datetime
    match = datetime_re.match(value)
TypeError: expected string or bytes-like object

不知道为什么它不接受类似于django-q文档页面中给出的示例的时间格式。

编辑:正在调度的任务:

代码语言:javascript
复制
def test_task():
    print('Executed test task')

没有太复杂的东西,只是为了测试目的

EN

回答 1

Stack Overflow用户

发布于 2021-05-10 15:09:49

箭头对象模拟Python的datetime对象接口,但它们不是真正的datetime对象。因此,如果任何接收Arrow对象的代码显式检查您的值是否是诚实到良好的datetime,那么它都将失败。这正是django.db.models.fields.DateTimeField.to_python中的代码所做的事情:

代码语言:javascript
复制
def to_python(self, value):
    if value is None:
        return value
    if isinstance(value, datetime.datetime):
        return value
    if isinstance(value, datetime.date):
        value = datetime.datetime(value.year, value.month, value.day)
    ...
    try:
        parsed = parse_datetime(value)

正如您所看到的,当它与datetimedate实例不匹配时,Django将其交给parse_datetime()函数处理,该函数需要一个字符串。这解释了你的错误:TypeError: expected string or bytes-like object

您可以通过获取.datetime属性来解决此问题,该属性将返回一个普通的旧式python datetime,即

代码语言:javascript
复制
schedule(
        func='test.tasks.test_task',
        name='test_task_nightly',
        schedule_type=Schedule.DAILY,
        next_run=arrow.utcnow().replace(hour=23, minute=30).datetime,
        q_options={'timeout': 10800, 'max_attempts': 1},
    )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67431806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档