【问题标题】:Using datetime to compare with dates in Django使用 datetime 与 Django 中的日期进行比较
【发布时间】:2011-06-04 02:54:24
【问题描述】:

我在 Django 中有一个关于如何比较日期来解决一些解决方案的问题。例如,我的 models.py 中有一个日期字段,如下所示。

class Invoice(models.Model):
    payment_date = models.DateTimeField()

我想要做的是询问是否可以将 datetime.now 与 DateTimeField 进行比较。例如,如果我有一个付款日期列表,并且我想现在与 datetime 进行比较。逾期付款的付款日期显示为欠款。否则,它的值为零。

这是我的观点,以显示正在发生的事情。到目前为止,我已经尝试过,但我得到的 payment_date 值是 0,它晚于付款日期。

这里编辑是我的最新观点。有趣的是,我似乎得到了所有结果的欠款 = invoice_gross - 不像以前我得到全 0。所以它仍然无法正常工作。

@login_required
def homepage(request):
    invoices_list = Invoice.objects.all()
    invoice_name = invoices_list[0].client_contract_number.client_number.name
    invoice_gross = invoices_list[0].invoice_gross
    payment_date = invoices_list[0].payment_date
    if payment_date <= datetime.now():
        owing = invoice_gross
        if payment_date > datetime.now():
            owing = 0
    return render_to_response(('index.html', locals()), {'invoices_list': invoices_list ,'invoice_name':invoice_name, 'invoice_gross':invoice_gross,'payment_date':payment_date,'owing':owing}, context_instance=RequestContext(request))

哦,我的桌子基本上是在做这样的事情。

ID  Owing
1   100   (All the same value)
2   100
3   100
.   .
.   .
.   .

【问题讨论】:

    标签: django datetime views models datefield


    【解决方案1】:

    我认为问题出在这条线上

    if datetime.now() == payment_date:
    

    这将真正查看payment_date 是否现在。我想你想看看现在是否大于或等于payment_date,在这种情况下你应该使用

    if datetime.now() >= payment_date:
    

    您也可以在查询数据库时只过滤发票:

    invoices_list = Invoice.objects.filter(payment_date__lte=datetime.now())
    

    更新

    您的代码是错误的,因为您有互斥条件。看:

    if payment_date <= datetime.now():
        owing = invoice_gross
        if payment_date > datetime.now():
            owing = 0
    

    首先检查payment_date 是否在现在之前。然后将owing 设置为invoice_gross那么在同一个条件下,它会检查payment_date 是否在现在之后。但这不可能!如果payment_date 现在是之前,那么你只有在这个代码块中!

    我认为你有一个缩进错误,并且想要这个:

    if payment_date <= datetime.now():
        owing = invoice_gross
    if payment_date > datetime.now():
        owing = 0
    

    当然,与以下内容相同:

    if payment_date <= datetime.now():
        owing = invoice_gross
    else:
        owing = 0
    

    【讨论】:

    • 如果我更改“如果 datetime.now >= payment_date:” 我得到这个错误 can't compare datetime.date to builtin_function_or_method
    • datetime.now是一个函数,通过datetime.now()调用它
    • 回到我的电脑上。它仍然无法正常工作。看看最新的代码。
    • 有趣的缩进错误已经停止出现。唯一的问题是我仍然有同样的问题。我有一张表格,其中一列显示发票编号。另一个显示欠款。每个发票编号对应于欠款。当至少有一个欠款 = invoice_gross 时,该列中的所有行都显示相同的欠款值。我不确定它为什么这样做。
    • @Shehzad009:嗯,您只是检查了第一张发票的付款日期,并将owing设置为该值。这就是你想要的吗?
    【解决方案2】:

    使用datetime.now()(注意括号)。除此之外,请记住该字段将始终datetime 对象。另外,(我猜)你应该只检查 datetimedate 以匹配当前日期(否则它将只匹配特定的秒数)。为此,您必须检查 payment_date.date() == date.today() 是否(其中 datedatetime.date

    这也意味着你可以像这样过滤:Invoice.objects.filter(payment_date__lte=datetime.now())

    __lte__gte__lt__gt 用于&lt;=&gt;=&lt;&gt;

    【讨论】:

      猜你喜欢
      • 2013-07-20
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 2021-09-22
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多