簡體   English   中英

為什么django-q會用箭頭時間拋出異常

[英]Why does django-q throw exception with arrow time

我正在嘗試創建一個 Django-q 計划並按照文檔使用arrow進行下一次運行,但計划出現以下錯誤:

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},
    )
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 文檔頁面中給出的示例的時間格式。

編輯:正在安排的任務:

def test_task():
    print('Executed test task')

僅出於測試目的沒有什么太復雜的

Django ORM(在撰寫本文時版本為 3.2)不會接受任何DateTimeField中的 Arrow object。

箭頭對象模擬 Python 的datetime時間 object 接口,但它們不是真正的datetime時間對象。 因此,如果接收到 Arrow object 的任何代碼明確檢查您的值是否是誠實的datetime ,它將失敗。 這正是django.db.models.fields.DateTimeField.to_python中的代碼似乎在做什么:

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)

如您所見,當它與datetime時間或date實例不匹配時,Django 將其parse_datetime() function 來處理,它需要一個字符串。 這解釋了你的錯誤: TypeError: expected string or bytes-like object

您可以通過獲取.datetime屬性來解決此問題,該屬性將返回一個普通的舊 python datetime ,即

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},
    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM