[英]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.