1
+ import datetime
1
2
import logging
2
3
import uuid
3
4
from typing import TYPE_CHECKING , Any , Generic , Optional , TypeVar
@@ -46,14 +47,17 @@ def __class_getitem__(cls, _):
46
47
return cls
47
48
48
49
50
+ DATE_MAX = datetime .datetime (9999 , 1 , 1 , tzinfo = datetime .timezone .utc )
51
+
52
+
49
53
class DBTaskResultQuerySet (models .QuerySet ):
50
54
def ready (self ) -> "DBTaskResultQuerySet" :
51
55
"""
52
56
Return tasks which are ready to be processed.
53
57
"""
54
58
return self .filter (
55
59
status = ResultStatus .NEW ,
56
- ).filter (models .Q (run_after = None ) | models .Q (run_after__lte = timezone .now ()))
60
+ ).filter (models .Q (run_after = DATE_MAX ) | models .Q (run_after__lte = timezone .now ()))
57
61
58
62
def succeeded (self ) -> "DBTaskResultQuerySet" :
59
63
return self .filter (status = ResultStatus .SUCCEEDED )
@@ -95,10 +99,12 @@ class DBTaskResult(GenericBase[P, T], models.Model):
95
99
96
100
task_path = models .TextField (_ ("task path" ))
97
101
98
- queue_name = models .TextField (_ ("queue name" ), default = DEFAULT_QUEUE_NAME )
99
- backend_name = models .TextField (_ ("backend name" ))
102
+ queue_name = models .CharField (
103
+ _ ("queue name" ), default = DEFAULT_QUEUE_NAME , max_length = 32
104
+ )
105
+ backend_name = models .CharField (_ ("backend name" ), max_length = 32 )
100
106
101
- run_after = models .DateTimeField (_ ("run after" ), null = True )
107
+ run_after = models .DateTimeField (_ ("run after" ))
102
108
103
109
return_value = models .JSONField (_ ("return value" ), default = None , null = True )
104
110
@@ -108,9 +114,19 @@ class DBTaskResult(GenericBase[P, T], models.Model):
108
114
objects = DBTaskResultQuerySet .as_manager ()
109
115
110
116
class Meta :
111
- ordering = [F ("priority" ).desc (), F ("run_after" ).asc (nulls_last = True )]
117
+ ordering = [F ("priority" ).desc (), F ("run_after" ).asc ()]
112
118
verbose_name = _ ("Task Result" )
113
119
verbose_name_plural = _ ("Task Results" )
120
+ indexes = [
121
+ models .Index (
122
+ "status" ,
123
+ * ordering ,
124
+ name = "django_task_new_ordering_idx" ,
125
+ condition = Q (status = ResultStatus .NEW ),
126
+ ),
127
+ models .Index (fields = ["queue_name" ]),
128
+ models .Index (fields = ["backend_name" ]),
129
+ ]
114
130
115
131
if django .VERSION >= (5 , 1 ):
116
132
constraints = [
@@ -139,7 +155,7 @@ def task(self) -> Task[P, T]:
139
155
return task .using (
140
156
priority = self .priority ,
141
157
queue_name = self .queue_name ,
142
- run_after = self .run_after ,
158
+ run_after = None if self . run_after == DATE_MAX else self .run_after ,
143
159
backend = self .backend_name ,
144
160
)
145
161
0 commit comments