我有一个按开始日期和持续时间(以天为单位)定义订阅期的模型:class SubscriptionProduct(models.Model): start_date = models.DateField() duration = models.IntegerField()我需要能够过滤当前处于事件状态的订阅,例如开始日期 我找不到 django 的方式来做到这一点。我可以使用使用 postgres 的 DATEADD 等效的 INTERVAL 的原始 SQL 语句,但我更喜欢使用内置的和非数据库特定的东西。我假设理想情况下我正在寻找 dateadd 注释方法。就像是:SubscriptionProduct.objects.annotate(end_date=DateAdd('start_date','duration').filter(start_date__lt=datetime.now, end_date__gte=datetime.now) 最佳答案 我最终编写了一个自定义的 Func 表达式,它完全符合我的要求。这是非常特定于 Postgresql 的,有点 hacky 但它有效,即使在比上述查询更复杂的查询中使用时也是如此。class DateAdd(Func): """ Custom Func expression to add date and int fields as day addition Usage: SubscriptionProduct.objects.annotate(end_date=DateAdd('start_date','duration')).filter(end_date__gt=datetime.now) """ arg_joiner = " + CAST(" template = "%(expressions)s || ' days' as INTERVAL)" output_field = DateTimeField()请注意,我必须执行 arg_joiner 技巧,以便在子选择表达式中使用时正确解析两个字段名称关于python - 在 Django 过滤器中使用 dateadd,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33981468/
10-13 03:45