【问题标题】:How to set a timedelta in between two model datefields如何在两个模型日期字段之间设置时间增量
【发布时间】:2019-07-29 08:54:30
【问题描述】:

我已经尝试在我的模型的两个字段中设置时间增量,然后显示两者之间的差异。

我已经尝试过 Stack 和许多其他教程,但不太确定是否应该在我的模型或我的视图上创建一个函数,或者我已经尝试过所有这些的视图上的一个基本变量是我的代码:

模型.PY

from django.db import models
from datetime import datetime
from datetime import timedelta


class To_do (models.Model):
    task = models.CharField(max_length=150)
    topic = models.CharField(max_length=150)
    how = models.TextField(max_length=600)
    start = models.DateField(blank=False)
    end = models.DateField(blank=False)

    def __str__(self):
        return self.task

VIEWS.PY
class DetailView(DetailView):
    template_name = 'details.html'
    model = To_do

    def get_queryset(self):
        return To_do.objects.all()

    def get_delta(self):
        d1 = To_do.start
        d2 = To_do.end
        tdelta = d1-d2
        return tdelta

我想显示星号和结尾之间的差异,然后再设置警报,如果不到三天。 感谢您的帮助。

【问题讨论】:

    标签: python django python-3.x django-models django-views


    【解决方案1】:

    您可以注释您的查询集以计算差异,例如:

    from django.db.models import DurationField, ExpressionWrapper, F
    
    class DetailView(DetailView):
        template_name = 'details.html'
        model = To_do
    
        def get_queryset(self):
            return To_do.objects.annotate(
                delta=ExpressionWrapper(F('end') - F('start'), output_field=DurationField())
            )

    从这个查询集产生的对象将有一个额外的字段delta 这里是一个timedelta 对象,其中包含结束和开始之间的差异。

    【讨论】:

    • woohooo 谢谢先生,我一直在尝试这个。所以每当我想从两个模型字段之间的一些数学运算中创建一个变量时,我都可以使用 ExpressionWrapper。我正在阅读文档。
    • @lucasrf27:ExpressionWrapper 通常不是必需的,但在这里它是给 Django 一个“提示”该字段的类型。例如,如果这两个项目是整数,您可以使用 diff=F('int1') - F('int2') 进行注释
    • 对不起,先生,我还有一个疑问,任何关于从结束日期中减去一天日期的最佳方法的提示,然后他们得到我剩下的天数?
    猜你喜欢
    • 2015-10-18
    • 2020-11-12
    • 2017-09-14
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2016-07-10
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多