【问题标题】:How to perform an F() query with datetime field?如何使用日期时间字段执行 F() 查询?
【发布时间】:2018-12-16 13:27:15
【问题描述】:

我想根据模型的两个字段进行查询,一个日期,一个整数偏移量,用作时间增量

model.objects.filter(last_date__gte=datetime.now()-timedelta(days=F('interval')))

我的模型是这样的:

class Line(models.Model):
    last_date = models.DateTimeField(auto_now=True)
    interval = models.IntegerField(default=0)

我正在使用 Django 2.0db.sqlite3

我找到了一些来源 What is the replacement for DateModifierNode in new versions of DjangoMaking queries using F() and timedelta at django,但它们没有帮助。

有些人建议使用持续时间字段,但我希望以天为单位输入间隔,每当我使用持续时间字段时,管理员需要在管理表单中的 [days hh:mm:ss] 中输入。

还有人给出了方法

model.objects.filter(last_date__gte=datetime.now()-timedelta(days=1)*F('interval'))

在 db.sqlite3 中不起作用并返回错误。

请建议我一些解决方案,例如管理员使用持续时间字段并仅输入天数或某些带有天数整数字段的解决方案。

【问题讨论】:

  • interval 是什么类型?请发布您模型的相关部分。
  • 整数类型
  • @SiddanathamSaikalyan 也许最好为interval 使用DurationField,然后为管理视图注册一个自定义form,它只允许输入天数。跨度>

标签: python django


【解决方案1】:

我是这样处理的:

class Line(models.Model):
  last_date = models.DateTimeField(auto_now=True)
  interval1 = models.IntegerField(default=0)
  interval2 = models.DurationField(default=0)

  def save(self, *args, **kwargs):
    self.interval2 = timedelta(days=self.interval1)
    super(Line, self).save(*args, **kwargs)

我使用了两个字段,在保存时我将interval1(整数字段)转换为interval2(DurationField)并在表单中排除了interval2,然后可以轻松应用过滤器。

  model.objects.filter(last_date__gte=datetime.now()- F('interval2'))

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 2014-06-27
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多