10

我在 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
.   .
.   .
.   .
4

2 回答 2

12

我认为问题出在一线

if datetime.now() == payment_date:

从字面上看,这是否payment_date现在。我想你想看看 now 是否大于或等于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在现在之前。然后它设置owinginvoice_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
于 2011-01-05T16:08:53.367 回答
10

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

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

__lte, __gte, __lt,__gt用于<=, >=,<>

于 2011-01-05T16:05:35.993 回答