【问题标题】:Math Operations on DateField DjangoDateField Django 上的数学运算
【发布时间】:2019-11-27 20:22:55
【问题描述】:

当有人输入时,日期和时间将按预期记录。我很好奇的是如何在那个日期进行数学运算。就像我想显示创建对象的日期,以及未来 2 周的日期。

models.py

from django.db import models

class Checkout(models.Model):
    member_id = models.IntegerField(null = True)
    title = models.CharField(max_length = 1000)
    date_checkout = models.DateField(auto_now = True)
    # expected_return = date_checkout * 2

我以为我偶然发现了一个有用的在线资源,其中提到了一些关于此的内容,但我再也找不到了。如果您可以向我指出一些在线资源,那就太棒了。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    您可以提供一个可调用的默认值,然后存储该结果(假设您实际上想要存储 expected_return(即用于查询))

    class Checkout(models.Model):
        member_id = models.IntegerField(null = True)
        title = models.CharField(max_length = 1000)
        date_checkout = models.DateField(auto_now = True)
        expected_return = models.DateField(default=lambda:datetime.datetime.now()+datetime.timedelta(days=14))
    
    Checkout.objects.filter(expeded_return__lt=datetime.datetime.now())
    checked_out_item.expected_return
    

    如果你希望它是一个实际的字段(即可以查询Checkout.objects.filter(expeded_return__lt=datetime.datetime.now())

    如果您只是想要一种简单的访问方式,那么类上的属性可以使函数看起来像属性

    class Checkout(models.Model):
        member_id = models.IntegerField(null = True)
        title = models.CharField(max_length = 1000)
        date_checkout = models.DateField(auto_now = True)
        @property
        def expected_return(self):
            return self.date_checkout + datetime.timedelta(days=14)
    
    print(checked_out.expected_return)
    

    如果您选择第二个选项,则需要确保仅在设置结帐日期后使用它

    from demo_app.models import Checkout
    c = Checkout(member_id=1,title="asd")
    c.expected_return # since there is no date_checkout we get error
    Traceback (most recent call last):
      File "C:\Users\joran\AppData\Local\Programs\Python\Python37-32\lib\site-packages\IPython\core\interactiveshell.py", line 3296, in run_code
        exec(code_obj, self.user_global_ns, self.user_ns)
      File "<ipython-input-4-4687ba4c4a16>", line 1, in <module>
        c.expected_return # since there is no date_checkout we get error
      File "D:\demo_django\demo_app\models.py", line 11, in expected_return
        return self.date_checkout + datetime.timedelta(days=14)
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'datetime.timedelta'
    c.save()
    c.expected_return # since there is now a checkout it works
    Out[6]: datetime.date(2019, 12, 14)
    
    import datetime
    c = Checkout(member_id=1,title="asd",date_checkout=datetime.datetime.now())
    c.expected_return # since we set the date_checkout it will work even though its not saved
    Out[10]: datetime.datetime(2019, 12, 14, 13, 36, 21, 270897)
    

    【讨论】:

    • 奇怪,但起初,这很好用。但是当我去向 Checkout 表添加一个新行时,我得到了一个新的错误。 TypeError at /report/ unsupported operand type(s) for +: 'NoneType' and 'datetime.timedelta' 奇怪的是它说错误在 base.html 的第 12 行。 否则,您的建议非常有效。我用它来显示预计在两周内退货的日期。谢谢
    • 异常值:+ 不支持的操作数类型:'NoneType' 和 'datetime.timedelta'
    • 你一定用过第二个选项吧?您需要先保存模型,然后才能使用该属性(或至少设置 date_checkout)
    • 我不太确定你的意思。如果它能让事情变得更容易,我可以开始另一个问题,这样我就可以正确地展示发生了什么。但是自从上一个答案以来,我得到了一个不同的错误。 “基数为 10 的 int() 的无效文字:b'19 21:09:31.264966'”。似乎任何需要从 Checkout 表中获取信息的页面都会收到此错误。当然,感谢您一直以来的帮助。
    • 哦,是的,我确实选择了第二个选项。我不认为 Django 对 lambdas 进行消毒。
    猜你喜欢
    • 2011-03-10
    • 2011-05-13
    • 2015-10-04
    • 1970-01-01
    • 2018-03-26
    • 2021-09-28
    • 2019-10-16
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多