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,没问题