2011-01-05 26 views
7

Tôi có một câu hỏi ở Django về cách bạn có thể so sánh ngày để giải quyết một số giải pháp. Ví dụ tôi có một trường ngày tháng trong models.py của tôi Giống như dưới đây.Sử dụng datetime để so sánh với ngày tháng trong Django

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

Điều tôi muốn làm là hỏi xem liệu có phải là cách so sánh datetime.now với DateTimeField hay không. Ví dụ, nếu tôi có một danh sách các ngày thanh toán và tôi muốn so sánh với datetime ngay bây giờ. Thau payment_date bị trễ với thanh toán của họ được hiển thị trong thời gian đáo hạn. Nếu không, nó là giá trị bằng không.

Đây là quan điểm của tôi để hiển thị những gì đang diễn ra. Tôi đã thử cho đến nay nhưng tôi nhận được một giá trị 0 cho payment_date của mà là muộn hơn ngày thanh toán.

Chỉnh sửa ở đây là lượt xem mới nhất của tôi. Điều thú vị là tôi dường như đang nhận được owing = invoice_gross cho tất cả các kết quả - không giống như trước đây khi tôi nhận được tất cả 0 giây. Vì vậy, nó vẫn không hoạt động đúng.

@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)) 

Oh và bảng của tôi về cơ bản đang làm một cái gì đó như thế này.

ID Owing 
1 100 (All the same value) 
2 100 
3 100 
. . 
. . 
. . 

Trả lời

7

Tôi nghĩ vấn đề là trong dòng

if datetime.now() == payment_date: 

Đó nghĩa là sẽ thấy nếu payment_datengay bây giờ. Tôi nghĩ rằng bạn muốn nhìn thấy nếu bây giờ là lớn hơn hoặc bằng với payment_date, trong trường hợp này bạn nên sử dụng

if datetime.now() >= payment_date: 

Bạn cũng có thể chỉ lọc các hoá đơn khi bạn truy vấn cơ sở dữ liệu:

invoices_list = Invoice.objects.filter(payment_date__lte=datetime.now()) 

Cập nhật

Mã của bạn sai vì bạn có các điều kiện loại trừ lẫn nhau. Hãy xem:

if payment_date <= datetime.now(): 
    owing = invoice_gross 
    if payment_date > datetime.now(): 
     owing = 0 

Kiểm tra đầu tiên để xem nếu payment_date là trước bây giờ. Sau đó, nó đặt owing thành invoice_gross. Sau đó,, trong cùng điều kiện, nó sẽ kiểm tra xem nếu payment_date là sau bây giờ.Nhưng điều đó không thể! Bạn chỉ trong khối mã này nếu payment_datetrước ngay bây giờ!

Tôi nghĩ rằng bạn có một lỗi thụt đầu dòng, và muốn điều này thay vì:

if payment_date <= datetime.now(): 
    owing = invoice_gross 
if payment_date > datetime.now(): 
    owing = 0 

Trong đó, tất nhiên, cũng giống như:

if payment_date <= datetime.now(): 
    owing = invoice_gross 
else: 
    owing = 0 
+0

nếu tôi thay đổi "nếu datetime.now> = payment_date: "Tôi nhận được lỗi này không thể so sánh datetime.date với builtin_function_or_method – Shehzad009

+1

' datetime.now' là một hàm, gọi nó bằng 'datetime.now()' – crodjer

+0

Quay lại máy tính của tôi. Nó vẫn không hoạt động đúng. Nhìn vào mã mới nhất. – Shehzad009

9

Sử dụng datetime.now() (chú ý các parens). Ngoài ra, hãy nhớ rằng trường sẽ luôn là là đối tượng datetime. Ngoài ra, (tôi đoán vậy), bạn chỉ nên kiểm tra ngày ngày trong số ngày giờ để khớp với ngày hiện tại (nếu không nó sẽ chỉ khớp với ngày cụ thể thứ hai). Để biết rằng bạn phải kiểm tra xem payment_date.date() == date.today() (trong đó datedatetime.date)

Điều này cũng có nghĩa là bạn có thể lọc như sau: Invoice.objects.filter(payment_date__lte=datetime.now()).

__lte, __gte, __lt, __gt được sử dụng cho <=, >=, <>