我正在使用 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 不是聚合表达式
我认为您不需要为此自定义原始查询。我们可以合作:
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
存储在歌曲中看起来很奇怪,通常您会创建一个单独的模型来存储每首歌曲播放时的信息,以便您可以进行额外的过滤、聚合等。