繁体   English   中英

DateField Django 上的数学运算

[英]Math Operations on DateField Django

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

模型.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

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

您可以提供一个可调用作为默认值,然后存储该结果(假设您实际上想要存储 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM