Основная проблема заключается в том, что вы не понимаете, почему вы получаете ошибку
name 'publisher__stats__elapsed_time_in_seconds' is not defined`.
Давайте еще раз посмотрим на код:
Article.objects.filter(created_on__lte=datetime.now(timezone.utc) -
timedelta(hours=0, minutes=0, seconds=publisher__stats__elapsed_time_in_seconds))
Вкод над символом publisher__stats__elapsed_time_in_seconds
интерпретируется как ссылка на переменную, которая не определена в вашем коде. Если вы добавили
publisher__stats__elapsed_time_in_seconds = 1
непосредственно перед фрагментом кода выше, вы не получитеошибка.(Вы также не получите желаемых результатов.) Вы ожидаете, что ORM в Django будет работать с символом publisher__stats__elapsed_time_in_seconds
, но прежде чем Django сможет добраться до него, интерпретатор Python должен интерпретировать код и способ написания кода,это просто имя переменной, которую должен разрешить интерпретатор.Django не имеет возможности даже увидеть его.
Хорошо, поэтому способ запретить интерпретатору интерпретировать имя как ссылку на переменную и заставить Django ORM обрабатывать имя, заключается в использовании F()
выражения .Таким образом, у вас будет соблазн просто сделать это:
Article.objects.filter(created_on__lte=datetime.now(timezone.utc) -
timedelta(hours=0, minutes=0, seconds=F("publisher__stats__elapsed_time_in_seconds")))
Но тогда вы будете передавать timedelta
параметр, который он не знает, как обрабатывать.
Как указал Шиллингтв комментарии , в другом ответе Lutz Prechelt показано, как переместить выражение F()
за пределы timedelta
.В вашем случае вы можете сделать это:
Article.objects.filter(created_on__lte=datetime.now(timezone.utc) -
timedelta(seconds=1) * F("publisher__stats__elapsed_time_in_seconds"))))