2011-01-05 16 views
7

Mam pytanie w Django o tym, jak porównać daty, aby rozwiązać niektóre rozwiązania. Na przykład mam pole dat w moim models.py jak poniżej.Używanie datetime do porównania z datami w Django

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

Co chcę być w stanie zrobić to zapytać, czy jest sposób, aby porównać DateTime.Now z DateTimeField. Na przykład, jeśli mam listę dat płatności i chciałem teraz porównać z datetime. Zwracają datę zapłaty, która spóźnia się z ich płatnościami. W przeciwnym razie wartość wynosi zero.

Oto moje widoki, aby pokazać, co się dzieje. Próbowałem do tej pory, ale otrzymuję wartość 0 dla daty płatności, która jest późniejsza niż data płatności.

Tutaj edytuję moje najnowsze widoki. Zabawne jest to, że wydaje mi się, że uzyskuję owing = invoice_gross dla wszystkich wyników - w przeciwieństwie do wcześniejszych, kiedy otrzymywałem wszystkie 0. Więc nadal nie działa poprawnie.

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

Och i mój stół w zasadzie robi coś takiego.

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

Odpowiedz

7

Myślę, że problem jest w linii

if datetime.now() == payment_date: 

To będzie dosłownie zobaczyć czy payment_date jest w tej chwili. Myślę, że chcesz zobaczyć, czy teraz jest większa lub równa payment_date, w takim przypadku należy użyć

if datetime.now() >= payment_date: 

Można też po prostu filtrować faktury podczas przeszukiwania bazy danych:

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

Aktualizacja

Twój kod jest nieprawidłowy, ponieważ masz wzajemnie wykluczające się warunki. Spójrz:

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

że najpierw sprawdza, czy payment_date to przedtem. Następnie ustawia owing na invoice_gross. Następnie, w tym samym warunkowym, sprawdza, czy teraz jest już payment_date.Ale to nie może być! Jesteś tylko w tym bloku kodu, jeśli teraz payment_date jest przed teraz!

Chyba masz błąd wcięcia, a chcesz zamiast tego:

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

Który, oczywiście, jest taka sama jak:

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

jeśli zmienię „jeśli datetime.now> = payment_date: "Otrzymuję ten błąd nie mogę porównać datetime.date do builtin_function_or_method – Shehzad009

+1

' datetime.now' jest funkcją, wywołaj ją przez 'datetime.now()' – crodjer

+0

Powrót na moim komputerze. Nadal nie działa poprawnie. Spójrz na najnowszy kod. – Shehzad009

9

Użyj datetime.now() (zwróć uwagę na parens). Poza tym pamiętaj, że obiekt będzie zawsze obiektem o rozmiarze o numerze. Ponadto (domyślam się, że) powinieneś sprawdzić tylko datę z datetime, aby dopasować bieżącą datę (lub inaczej będzie tylko dopasować tę konkretną sekundę). Za to, że trzeba sprawdzić, czy payment_date.date() == date.today() (gdzie date jest datetime.date)

Oznacza to również, że można filtrować tak: Invoice.objects.filter(payment_date__lte=datetime.now()).

__lte, __gte, __lt, __gt służą do <=, >=, < i >