Код: Выделить всё
max_played, avg_days_last_played = get_next_song_priority_values()
# Calculate time since played using raw SQL
time_since_played_expr = RawSQL("(julianday('now') - julianday(main_song.played_at))", [])
query = Song.objects
# Annotate priority
songs_with_priority = query.annotate(
time_since_played=ExpressionWrapper(time_since_played_expr, output_field=FloatField()),
priority=(
F('rating')
- (F('count_played') / Value(max_played))
+ (F('time_since_played') / Value(avg_days_last_played))
),
).order_by('-priority')
Код: Выделить всё
logger.info(f'Next Song: {next_song}')
calculated_priority = (
next_song.rating
- (next_song.count_played / max_played)
+ (next_song.time_since_played / avg_days_last_played)
)
logger.info(f'Next Song: priority {next_song.priority:.2f} vs calc {calculated_priority:.2f}')
logger.info(f'Next Song: rating {next_song.rating:.2f}')
playd = next_song.count_played / max_played
logger.info(f'Next Song: played {playd:.2f} ({next_song.count_played} / {max_played})')
tspd = next_song.time_since_played / avg_days_last_played
logger.info(
f'Next Song: days {tspd:.2f} ({next_song.time_since_played} / {avg_days_last_played})'
)
Код: Выделить всё
INFO Next Song:
INFO Next Song: priority 2.73 vs calc 2.56
INFO Next Song: rating 0.50
INFO Next Song: played 0.17 (1 / 6)
INFO Next Song: days 2.23 (4.043296354357153 / 1.8125720233656466)
рейтинг 0,5 — сплошной,
воспроизведение засчитывается, если 1 против 6 — сплошной,
время с момента используется из результата next_song.time_since_played .
Я использую те же значения, которые должен использовать sqlite, но мой расчет другой.
Подробнее здесь: https://stackoverflow.com/questions/790 ... t-recreate