Как просуммировать два поля даты в sqlite с помощью django orm
В моей модели django5 есть два поля datetime, bgg_looked_at
и updated_at
. Они могут быть обнулены, но поля не должны быть нулевыми при выполнении этого запроса.
До сих пор я пытался
class UnixTimestamp(Func):
function = 'strftime'
template = "%(function)s('%%s', %(expressions)s)" # Escape % with %%
output_field = FloatField() # Explicitly declare the output as FloatField
и
listings = Listing.objects.annotate(
bgg_looked_at_timestamp=Coalesce(
UnixTimestamp(F('bgg_looked_at')),
Value(0.0, output_field=FloatField())
),
updated_at_timestamp=Coalesce(
UnixTimestamp(F('updated_at')),
Value(0.0, output_field=FloatField())
)
).annotate(
sum_fields=ExpressionWrapper(
F('bgg_looked_at_timestamp') + F('updated_at_timestamp'),
output_field=FloatField()
)
).order_by('sum_fields')
но я получаю
TypeError: недостаточно аргументов для строки формата
когда я просто делаю len(listings)
Django выполняет вторую интерполяцию, поэтому первая интерполяция генерирует %s
, а затем форматирует его с параметрами.
Вы можете исправить это с помощью:
class UnixTimestamp(Func):
function = 'strftime'
template = "%(function)s('%%%%s', %(expressions)s)"
output_field = FloatField()
При этом я не думаю, что имеет смысл суммировать две временные метки. Это все равно что складывать две позиции, вы должны добавить позицию с вектором (дельта времени), а не вторую временную метку.