Python 当自定义模型函数';它不是django数据库的一部分吗?
我有一个项目,我需要打开和关闭门票。这是我的机票型号:Python 当自定义模型函数';它不是django数据库的一部分吗?,python,django,Python,Django,我有一个项目,我需要打开和关闭门票。这是我的机票型号: class Ticket(models.Model): issue = models.CharField(max_length=100) user = models.ForeignKey('Users', blank=True, null=True, related_name="tickets") date_opened = models.DateTimeField('Date opened') date_c
class Ticket(models.Model):
issue = models.CharField(max_length=100)
user = models.ForeignKey('Users', blank=True, null=True, related_name="tickets")
date_opened = models.DateTimeField('Date opened')
date_closed = models.DateTimeField('Date closed', blank=True, null=True)
def __str__(self):
return self.issue
def time_to_solve(self):
time_to_solve = self.date_opened - self.date_closed
out = [ time_to_solve.hours//60 ]
return '{:d} hours'.format(*out)
我想计算date\u opened
和date\u closed
之间的平均时间差
在my views.py中,我创建了一个视图:
class Dashboard(ListView):
model = Ticket
template_name = 'assets/dashboard.html'
def get_context_data(self, **kwargs):
context = super(Dashboard, self).get_context_data(**kwargs)
context['time_to_complete'] = Q(status__contains='closed')).aggregate(time_opened = Avg('time_to_solve'))
return context
不幸的是,它不起作用,因为“解决时间”不是数据库的一部分
我怎样才能做到这一点 您只能聚合模型字段,但在python中这样做并不困难:
tickets = Ticket.objects.filter(status__contains='closed')
average = sum(map(lambda x: x.time_to_solve(), tickets)) / tickets.count()
在这种情况下,time\u to\u solve
应该返回类似秒数的值,然后您可以根据需要设置格式
根据票证的数量,这可能不是最快的解决方案。如果性能是一个问题,您可能需要使用某种非规范化。您只能聚合模型字段,但在python中这样做并不困难:
tickets = Ticket.objects.filter(status__contains='closed')
average = sum(map(lambda x: x.time_to_solve(), tickets)) / tickets.count()
在这种情况下,time\u to\u solve
应该返回类似秒数的值,然后您可以根据需要设置格式
根据票证的数量,这可能不是最快的解决方案。如果性能是一个问题,您可能需要使用某种非规范化。您只能聚合模型字段,但在python中这样做并不困难:
tickets = Ticket.objects.filter(status__contains='closed')
average = sum(map(lambda x: x.time_to_solve(), tickets)) / tickets.count()
在这种情况下,time\u to\u solve
应该返回类似秒数的值,然后您可以根据需要设置格式
根据票证的数量,这可能不是最快的解决方案。如果性能是一个问题,您可能需要使用某种非规范化。您只能聚合模型字段,但在python中这样做并不困难:
tickets = Ticket.objects.filter(status__contains='closed')
average = sum(map(lambda x: x.time_to_solve(), tickets)) / tickets.count()
在这种情况下,time\u to\u solve
应该返回类似秒数的值,然后您可以根据需要设置格式
根据票证的数量,这可能不是最快的解决方案。如果性能是一个问题,您可能需要使用某种非规范化。我认为您不能直接使用ORM来实现这一点。您可以在Python中执行此操作,但这将从数据库中检索所有已关闭的票证行。如果要在SQL中执行此操作,则需要将查询表示为。如果您使用的是PostgreSQL,您可能会发现这一点很有用:。我认为您不能直接使用ORM实现这一点。您可以在Python中执行此操作,但这将从数据库中检索所有已关闭的票证行。如果要在SQL中执行此操作,则需要将查询表示为。如果您使用的是PostgreSQL,您可能会发现这一点很有用:。我认为您不能直接使用ORM实现这一点。您可以在Python中执行此操作,但这将从数据库中检索所有已关闭的票证行。如果要在SQL中执行此操作,则需要将查询表示为。如果您使用的是PostgreSQL,您可能会发现这一点很有用:。我认为您不能直接使用ORM实现这一点。您可以在Python中执行此操作,但这将从数据库中检索所有已关闭的票证行。如果要在SQL中执行此操作,则需要将查询表示为。如果您使用的是PostgreSQL,您可能会发现这一点很有用:。在Freenode上的#irc-django中找到了朋友的答案:
average = Ticket.objects.extra(
select={ 'date_difference': 'AVG(time_to_sec(TIMEDIFF(date_closed,date_opened)))'}).first().date_difference
context['average'] = "{:.2f}".format(average/86400)
return context
通过这种方式,它以2位小数的精度返回平均值,并在数据库级别执行所有操作,因此运行它比获取所有行要轻松得多 在Freenode上的#irc-django中找到了朋友的答案:
average = Ticket.objects.extra(
select={ 'date_difference': 'AVG(time_to_sec(TIMEDIFF(date_closed,date_opened)))'}).first().date_difference
context['average'] = "{:.2f}".format(average/86400)
return context
通过这种方式,它以2位小数的精度返回平均值,并在数据库级别执行所有操作,因此运行它比获取所有行要轻松得多 在Freenode上的#irc-django中找到了朋友的答案:
average = Ticket.objects.extra(
select={ 'date_difference': 'AVG(time_to_sec(TIMEDIFF(date_closed,date_opened)))'}).first().date_difference
context['average'] = "{:.2f}".format(average/86400)
return context
通过这种方式,它以2位小数的精度返回平均值,并在数据库级别执行所有操作,因此运行它比获取所有行要轻松得多 在Freenode上的#irc-django中找到了朋友的答案:
average = Ticket.objects.extra(
select={ 'date_difference': 'AVG(time_to_sec(TIMEDIFF(date_closed,date_opened)))'}).first().date_difference
context['average'] = "{:.2f}".format(average/86400)
return context
通过这种方式,它以2位小数的精度返回平均值,并在数据库级别执行所有操作,因此运行它比获取所有行要轻松得多 我原以为不用太多python就可以使用django,但现在我发现这是不可避免的。这并不是说我不喜欢python编程(实际上我做了很多),而是我正在努力缩短学习曲线。如果这是正确的方法,我将立即尝试。我得到“不支持的+操作数类型:'int'和'str'”。有什么想法吗?@RobDel这是因为
time\u to\u solve
返回一个字符串。您只需将其写成return self.date\u closed-self.date\u opened
,这样您就可以得到一个timedelta,您可以使用它来计算平均值(您可以添加和分割timedelta)。然后,您只需要将结果平均值格式化为字符串。正如我所说,time_to_solve应该返回一个数字(我将使用秒),您可以稍后对其进行格式化。我原以为我可以使用django而不需要太多python,但现在我发现这是不可避免的。这并不是说我不喜欢python编程(实际上我做了很多),而是我正在努力缩短学习曲线。如果这是正确的方法,我将立即尝试。我得到“不支持的+操作数类型:'int'和'str'”。有什么想法吗?@RobDel这是因为time\u to\u solve
返回一个字符串。您只需将其写成return self.date\u closed-self.date\u opened
,这样您就可以得到一个timedelta,您可以使用它来计算平均值(您可以添加和分割timedelta)。然后,您只需要将结果平均值格式化为字符串。正如我所说,time_to_solve应该返回一个数字(我将使用秒),您可以稍后对其进行格式化。我原以为我可以使用django而不需要太多python,但现在我发现这是不可避免的。这并不是说我不喜欢python编程(实际上我做了很多),而是我正在努力缩短学习曲线。如果这是正确的方法,我将立即尝试。我得到“不支持的+操作数类型:'int'和'str'”。有什么想法吗?@RobDel,没问题