Ошибка типа: тип CombinedExpression не определяет метод __round__ - PullRequest
0 голосов
/ 26 января 2019

Я использую консоль ipython (Python 3.7) в PyCharm. Я пытаюсь запустить запрос 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: type CombinedExpression не определяет round method"?

1 Ответ

0 голосов
/ 26 января 2019

datetime.now(timezone.utc) - F("created_on") является комбинированным выражением; Вы не можете передать это в функцию Python round(), здесь нет конкретного числа для округления, и вы все равно хотите, чтобы округление происходило на уровне базы данных.

Если мы предполагаем, что вы подключаетесь к базе данных, которая реализует функцию ROUND, то вы можете использовать выражение Func() , чтобы выразить это в фильтре 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)
...