使用datetime与Django中的日期进行比较

时间:2011-01-05 16:03:35

标签: django datetime views models datefield

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

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

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

以下是我的观点,以显示最新情况。到目前为止我已经尝试了但是我得到的pay_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
.   .
.   .
.   .

2 个答案:

答案 0 :(得分:9)

使用datetime.now()(请注意parens)。除此之外,请记住该字段始终datetime对象。此外,(我猜)你应该只检查 datetime date 以匹配当前日期(否则它只会匹配特定的第二个日期)。为此,您必须检查payment_date.date() == date.today()datedatetime.date

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

__lte__gte__lt__gt用于<=>=<>

答案 1 :(得分:7)

我认为问题在于

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