Как просуммировать два поля даты в 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()

При этом я не думаю, что имеет смысл суммировать две временные метки. Это все равно что складывать две позиции, вы должны добавить позицию с вектором (дельта времени), а не вторую временную метку.

Вернуться на верх