如何在sqlite(使用django)中使用朱利安日期聚合原始sql

问题描述 投票:0回答:1

我正在使用 sqlite3 和 django。我希望计算从上次玩到现在的所有天数的平均值。 (Last_played 只是一个日期时间字段)。

到目前为止我已经:

    avg_days_last_played_sql = """
        AVG(julianday('now') - julianday(played_at))
    """

    # Annotate the average days last played
    average_days_last_played = Song.objects.aggregate(
        avg_days_last_played=RawSQL(avg_days_last_played_sql, [])
    )['avg_days_last_played']

但它给出了错误:

类型错误:avg_days_last_played 不是聚合表达式

sql django sqlite
1个回答
0
投票

我认为您不需要为此自定义原始查询。我们可以合作:

from django.db.models import FloatField
from django.db.models.expressions import Func


class JulianDay(Func):
    function = 'julianday'
    output_field = FloatField()

然后使用:

from django.db.models import Avg, F
from django.db.models.functions import Now

Song.objects.aggregate(
    avg_days_last_played=Avg(JulianDay(Now()) - JulianDay(F('played_at')))
)['avg_days_last_played']

话虽这么说,将

played_at
存储在歌曲中看起来很奇怪,通常您会创建一个单独的模型来存储每首歌曲播放时的信息,以便您可以进行额外的过滤、聚合等。

© www.soinside.com 2019 - 2024. All rights reserved.