【问题标题】:Filter Django models based on date comparision根据日期比较过滤 Django 模型
【发布时间】:2020-02-17 15:52:42
【问题描述】:

我有一个具有 end_date 属性的订阅模型。

class Subscription(models.Model):
    client = models.OneToOneField(ClientProfile, on_delete=models.CASCADE)
    trainer = models.ForeignKey(TrainerProfile, null=True, blank=True,
        on_delete=models.SET_NULL, limit_choices_to={'is_staff': True})
    plan = models.ForeignKey(Plan, on_delete=models.CASCADE)
    transaction = models.OneToOneField(PaymentHistory, on_delete=models.CASCADE)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

我想向订阅了通知的用户发送一封电子邮件:

(subscription.end_date - timezone.now()).days < 3

我将如何根据 filter() 中的这些类型的比较过滤来自 django 的数据,而不是读取内存中的所有订阅对象。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    首先,您可以从现在开始找到 3 天。之后可以使用end_date__lte 参数。像这样:

    comparing_date =  datetime.datetime.today() + datetime.timedelta(days=3)
    subscriptions =  Subscription.objects.filter(end_date__lte=comparing_date)
    

    【讨论】:

    • 我确定你的回答逻辑和现在一样是错误的。
    • 应该是comparing_date = timezone.now() + datetime.timedelta(days=3)。查询正确。
    • 没错。但我想让他看到他写的文字是正确的,而不是代码中的逻辑。
    • 但是这句话也是错误的,因为首先你需要得到3天后的日期(不是3天前)。
    • 我刚刚注意到这种方法可能会出错。如果该用户的订阅记录没有被删除,那么将从 end_date 前 3 天开始每天发送邮件。所以我认为这种方法不符合 (subscription.end_date - timezone.now()).days
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2018-09-25
    • 2020-08-10
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多