从现在起Django过滤器对象F('duration')

时间:2019-03-13 15:00:26

标签: python django django-queryset

我有一个模特:

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 :(得分:0)

您不能将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'))

答案 1 :(得分:0)

好吧,不要以为这是最好的选择,但是最终像这样切换到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'))