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

She*_*009 7 django datetime views models datefield

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

class Invoice(models.Model):
    payment_date = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)

我想要做的是询问是否可以将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))
Run Code Online (Sandbox Code Playgroud)

哦,我的桌子基本上都是这样做的.

ID  Owing
1   100   (All the same value)
2   100
3   100
.   .
.   .
.   .
Run Code Online (Sandbox Code Playgroud)

Gab*_*aru 9

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

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

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


mip*_*adi 7

我认为问题就在于此

if datetime.now() == payment_date:
Run Code Online (Sandbox Code Playgroud)

从字面上看,这payment_date是否正确.我想你想看看现在是否大于或等于payment_date,在这种情况下你应该使用

if datetime.now() >= payment_date:
Run Code Online (Sandbox Code Playgroud)

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

invoices_list = Invoice.objects.filter(payment_date__lte=datetime.now())
Run Code Online (Sandbox Code Playgroud)

更新

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

if payment_date <= datetime.now():
    owing = invoice_gross
    if payment_date > datetime.now():
        owing = 0
Run Code Online (Sandbox Code Playgroud)

首先检查是否payment_date在此之前.然后它设置owinginvoice_gross.然后,在相同的条件下,它检查是否payment_date在此之后.但那不可能!你只是在这个代码块,如果payment_date以前,现在!

我认为你有一个缩进错误,并希望这样:

if payment_date <= datetime.now():
    owing = invoice_gross
if payment_date > datetime.now():
    owing = 0
Run Code Online (Sandbox Code Playgroud)

当然,这与以下内容相同:

if payment_date <= datetime.now():
    owing = invoice_gross
else:
    owing = 0
Run Code Online (Sandbox Code Playgroud)

  • `datetime.now` 是一个函数,通过 `datetime.now()` 调用它 (3认同)