TypeError:类型CombinedExpression没有定义__round__方法

时间:2019-01-26 18:15:06

标签: python django python-3.x orm rounding

我在PyCharm中使用ipython(Python 3.7)控制台。我正在尝试运行Django ORM查询,我想在其中进行一些日期数学运算,特别是计算秒数并将其与另一个字段进行比较。我尝试过

Article.objects.filter(article_stat__elapsed_time_in_seconds=(round(datetime.now(timezone.utc) - F("created_on")) / 300) * 300)

但是出现以下错误

Traceback (most recent call last):
  File "/Users/davea/Documents/workspace/mainpage_project/venv/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3267, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-18-607b95229a28>", line 1, in <module>
    Article.objects.filter(article_stat__elapsed_time_in_seconds=(round(datetime.now(timezone.utc) - F("created_on")) / 300) * 300)
TypeError: type CombinedExpression doesn't define __round__ method

这是有问题的模型...

class Article(models.Model):
    ...
    created_on = models.DateTimeField(default=datetime.now)

如何克服“ TypeError:类型CombinedExpression未定义方法”错误?

1 个答案:

答案 0 :(得分:0)

datetime.now(timezone.utc) - F("created_on")是一个组合表达式;您不能将其传递给Python round()函数,这里没有具体的数字要舍入,并且您仍然希望舍入在数据库级别进行。

如果我们假设您要连接到实现了ROUND函数的数据库,则可以使用Func() expression在Django过滤器中表达这一点:

from django.db.models import F, Func

time_filter = (
    Func(
        datetime.now(timezone.utc) - F("created_on"),
        function='ROUND'
    ) / 300) * 300
Article.objects.filter(article_stat__elapsed_time_in_seconds=time_filter)