2011-01-05 110 views
7

我在Django中有一個關於如何比較日期以解決某些解決方案的問題。例如,我在我的models.py中有一個日期字段,如下所示。使用datetime與Django中的日期進行比較

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

我希望能做的是詢問是否是一種方法來比較datetime.now和DateTimeField。例如,如果我有付款日期列表,並且我想現在與日期時間進行比較。付款遲到的付款日期顯示爲欠款。否則,它的值是零。

這是我的看法,以顯示發生了什麼事情。我已嘗試到目前爲止,但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 
. . 
. . 
. . 

回答

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是否在此之前。然後,它設置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 
+0

如果我改變「如果datetime.now> = payment_date:「我得到這個錯誤 無法比較datetime.date builtin_function_or_method – Shehzad009 2011-01-05 16:35:05

+1

'datetime.now'是一個函數,通過'datetime.now()' – crodjer 2011-01-05 17:30:59

+0

返回到我的電腦上。它仍然無法正常工作。看看最新的代碼。 – Shehzad009 2011-01-06 10:18:35

9

使用datetime.now()(注意parens)。除此之外,請記住,該字段將始終爲是一個datetime對象。另外,(我猜),你應該只檢查日期時間日期來匹配當前日期(否則將只匹配特定秒)。爲此,您必須檢查payment_date.date() == date.today()(其中datedatetime.date

這也意味着您可以像這樣過濾:Invoice.objects.filter(payment_date__lte=datetime.now())

__lte__gte__lt__gt用於<=>=<>