如何在django模型方法中传递连接函数作为参数



我试图通过timezone.now() + timedelta(days=-2)timezone.now()作为django模型方法的参数,但我得到

def performance(user, timezone.now() + timedelta(days=-2), timezone.now()):
^
SyntaxError: invalid syntax

我知道错误是由于连接的结果,但我不知道如何解决这个问题。

class User(AbstractUser):
.........................
fields
.........................
def get_performance(self, timezone.now() + timedelta(days=-2), timezone.now()):
actual = Sum("scores", filter=Q(status="completed"))
q = self.taskassignt.filter(
due__gte=timezone.now() + timedelta(days=-2),
due__lt=timezone.now() 
).annotate(actual=actual, total=Sum("scores"))
return (q[0].actual / q[0].total) * 100

您需要指定一个参数名称,因此

def get_performance(self,start_time=timezone.now() + timedelta(days=-2),end_time=timezone.now()):
actual = Sum("scores", filter=Q(status="completed"))
q = self.taskassignt.filter(
due__gte=start_time,
due__lt=end_time 
).annotate(actual=actual, total=Sum("scores"))
return 100 * q[0].actual / q[0].total

但是这将不起作用,因为默认值将被初始化一次,然后每次都使用。这意味着如果您的服务器运行了整整一年,start_time将仍然是前一年的时间。

通常使用None作为默认值,如果参数确实是None,则将其替换为给定的表达式,因此:

def get_performance(self, start_time=None, end_time=None):
if start_time is None:
start_time = timezone.now() + timedelta(days=-2)
if end_time is None:
end_time = timezone.now()
actual = Sum("scores", filter=Q(status="completed"))
q = self.taskassignt.filter(
due__gte=start_time,
due__lt=end_time 
).annotate(actual=actual, total=Sum("scores"))
return 100 * q[0].actual / q[0].total

然而,有100 * q[0].actual / q[0].total是奇怪的。这意味着您只对第一个taskassignt感兴趣,而不是对全部感兴趣。可能你想要.aggregate(…)[Django-doc]代替.annotate(…)[Django-doc]:

def get_performance(self, start_time=None, end_time=None):
if start_time is None:
start_time = timezone.now() + timedelta(days=-2)
if end_time is None:
end_time = timezone.now()
actual = Sum("scores", filter=Q(status='completed'))
q = self.taskassignt.filter(
due__gte=start_time,
due__lt=end_time 
).aggregate(actual=actual, total=Sum("scores"))
return 100 * q['actual'] / q['total']

最新更新