【问题标题】:djang orm filter with self date column带有自我日期列的 django orm 过滤器
【发布时间】:2020-02-12 12:22:52
【问题描述】:

我有一个问题。

我的模型如下所示。

depart_date = models.DateField(null=True, blank=True, verbose_name=_("Depart Date"))
days = models.IntegerField(default=0, null=True, blank=True, verbose_name=_("Day"))

我想过滤我的数据出发日期 + 天数 >= 今天

可以使用 orm 查询吗?

当我在下面使用原始查询时(当我使用 oracle 时)它是如此简单

SELECT * FROM MY_TABLE = WHERE depart_date + days >= > TO_DATE('2020-01-01', 'YYYY-MM-DD')

感谢您的帮助

【问题讨论】:

  • 您可以在 ORM 中与depart_date__lte=TO_DATE(...) - days进行比较

标签: django filter orm


【解决方案1】:

你可以用F对象和expression wrapper试试运气:

from django.utils import timezone
from django.db.models import DateTimeField, ExpressionWrapper, F

YourModel.objects.annotate(days_delta=ExpressionWrapper(timezone.timedelta(seconds=1) * F("days"), output_field=DateTimeField()).annotate(final_date=ExpressionWrapper(F('depart_date') + F('days_delta'), output_field=DateTimeField())).filter(final_date__gte=timezone.now())

另外,您可能需要使用 value 来包装 timedelta 表达式部分。

注意:这可能不适用于某些数据库引擎。

【讨论】:

    【解决方案2】:

    您可以使用.annotate() 通过额外的步骤完成此操作。 比如粗略的想法是:

    return (YourModel
           .objects
           .annotate(full_date=F("depart_date") + F("days"))
           .fitler(full_date__gte=timezone.now())
    )
    

    【讨论】:

    • 这不是通过异常“表达式包含混合类型”吗?
    【解决方案3】:
    aim_date = depart_date - datetime.timedelta(days=7)
    
    
    # if you want to get datas which earler than 7 days ago,maybe you can try this
    obj_list=Customer.objects.filter(depart_date__lte=aim_date)
    

    希望能帮到你!

    【讨论】:

      【解决方案4】:

      感谢 charnel。

      我尝试使用您的代码,但出现错误

      所以,我像这样编辑您的示例代码

      model.objects.annotate(
              arrive_date=ExpressionWrapper(F('depart_date') + timedelta(days=1) * (F('day')),
                                            output_field=DateTimeField())).filter(arrive_date__gte={date})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-05
        • 1970-01-01
        • 1970-01-01
        • 2019-11-08
        • 2021-10-30
        • 1970-01-01
        • 2015-10-02
        • 1970-01-01
        相关资源
        最近更新 更多