我在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
. .
. .
. .
答案 0 :(得分:9)
使用datetime.now()
(请注意parens)。除此之外,请记住该字段始终是datetime
对象。此外,(我猜)你应该只检查 datetime 的 date 以匹配当前日期(否则它只会匹配特定的第二个日期)。为此,您必须检查payment_date.date() == date.today()
(date
是datetime.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