Django将计算的天数字段与浮点列相乘

时间:2018-08-09 07:59:20

标签: python django database date

在我的数据库中,我有两个日期字段,然后使用来计算这两个日期之间的差值

.annotate(delay=F('date_1') - F('date_2'))

现在我必须将此延迟乘以数据库中的另一列

F('delay')*F('amount')

但是遇到错误,也尝试通过追加天数来解决问题,

.annotate(a=Sum(F('delay')*F('amount')))

“延迟”是日期之间的差,金额是表中存在浮动数据类型的列。

1 个答案:

答案 0 :(得分:0)

假设您正在使用 MYSQL 数据库,并且模型为

class MyTime(models.Model):
    start = models.DateTimeField()
    end = models.DateTimeField()
    amount = models.IntegerField()


然后,将Custom DB Function定义为

from django.db.models.functions import Func


class DateDIFF(Func):
    function = 'TIMESTAMPDIFF'
    template = "%(function)s(day, %(expressions)s)"


然后尝试查询为

from django.db.models import IntegerField, F

MyTime.objects.annotate(diff_date=DateDIFF(F('start'), F('end'), output_field=IntegerField())).annotate(
    result=F('diff_date') * F('amount'))



示例

In [7]: from django.db.models import IntegerField, F
   ...: 
   ...: queryset = MyTime.objects.annotate(diff_date=DateDIFF(F('start'), F('end'), output_field=IntegerField())).annotate(
   ...:     result=F('diff_date') * F('amount'))
   ...:     

In [8]: queryset
Out[8]: [<MyTime: MyTime object>]

In [9]: queryset[0].__dict__
Out[9]: 
{'_state': ,
 'id': 1,
 'start': datetime.datetime(2018, 8, 2, 12, 6, 51, tzinfo=),
 'end': datetime.datetime(2018, 8, 9, 12, 6, 52, tzinfo=),
 'amount': 50,
 'diff_date': 7,
 'result': 350}