Django фильтрует объекты F («длительность») с этого момента - PullRequest
1 голос
/ 13 марта 2019

У меня есть модель:

class Examle(models.Model):
  date = models.DateTime(auto_add_now=True)
  duration = models.IntegerField(default=90) # days

И я хочу отфильтровать это так:

Example.objects.filter(date_lt=datetime.today() - timedelta(days=F('duration')))

Конечно, timedelta не примет F-объект в качестве допустимого параметра, но надеюсь, вы поняли, о чем я.

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Ну, не думайте, что это лучший вариант, но в конце концов переключитесь на DurationField вот так:

class Examle(models.Model):
date = models.DateTime(auto_add_now=True)
duration = models.DurationField(default=timedelta(days=90)) # days

И использовал это так:

Example.objects.filter(date_lt=datetime.now() - F('duration'))
0 голосов
/ 13 марта 2019

Вы не можете передать F на timedelta, но вы можете использовать его для вычисления:

timedelta(days=1) * F('duration')

В качестве альтернативы, если вы используете Django 2.x, попробуйте:

Example.objects.annotate(days_before_today=ExtractDay(datetime.today() - F('date'))\
    .filter(days_before_today__gte=F('duration'))
...