【问题标题】:filter statement based on calculations django orm基于计算的过滤语句 django orm
【发布时间】:2018-11-06 23:03:43
【问题描述】:

如何在 django orm 中翻译这样的查询?

select id, year, month 
where (year*100 + month) between 201703 and 201801

提前感谢您的帮助

【问题讨论】:

  • 如果可以使用 date_range 为什么还需要它?
  • @BearBrown,因为年份和月份是单独的整数

标签: django django-orm


【解决方案1】:

使用类似的东西怎么样。

你试过filter__range

Created_at 将是您数据库中的字段

ModelName.objects.filter(created_at__range=(start_date, end_date))

稍后您可以在视图中进行计算,这只是一种解决方法。

如果您想运行完全相同的查询,那么您可能可以使用运行。

ModelName.objects.raw("select id, year, month 
where (year*100 + month) between 201703 and 201801")

【讨论】:

    【解决方案2】:

    您可以先创建注释,然后对其进行过滤:

    from django.db.models import F
    
    (Modelname.objects
              .annotate(yearmonth=F('year')*100+F('month'))
              .filter(yearmonth__range=(201703, 201801)))

    所以这里我们构造了一个注解yearmonth(如果你愿意,你可以使用另一个名字),并使它等于year列乘以100加上month列。接下来,我们可以对该注释进行过滤,并通过在此处指定带有两个边界的 __range 来实现。

    通常,这适用于执行您在此处执行的操作(将列与常数相乘,将两个值相加)以及__range 过滤器(在 MySQL 中将其转换为 @ 987654327@)。然而,由于我们使用 Django ORM,如果我们稍后决定使用另一个数据库,查询将被翻译成另一个数据库查询语言(当然这是可能的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 2020-01-18
      • 2011-04-17
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      相关资源
      最近更新 更多