2011-01-05 10 views
7

Ich habe eine Frage in Django, wie Sie Daten vergleichen können, um einige Lösungen zu lösen. Zum Beispiel habe ich ein Datumsfeld in meinem models.py wie unten.Mit Datetime zum Vergleich mit Daten in Django

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

Was ich tun zu können, will, ist zu fragen, ob das ein Weg ist, einen datetime.now mit einem Datetimefield zu vergleichen. Zum Beispiel, wenn ich eine Liste von Zahlungsterminen hatte und ich jetzt mit datetime vergleichen wollte. Die Zahlungsdaten, die mit ihren Zahlungen verspätet sind, werden in der Schuld ausgewiesen. Ansonsten ist der Wert Null.

Hier ist meine Ansichten zu zeigen, was los ist. Ich habe es bisher versucht, aber ich bekomme einen 0 Wert für payment_dates, die später als das Zahlungsdatum sind.

Hier bearbeiten meine neuesten Ansichten. Lustig ist, dass ich scheinbar das "success = invoice_gross" für alle Ergebnisse bekomme - anders als vorher, als ich alle Nullen bekam. Es funktioniert also immer noch nicht richtig.

@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, und mein Tisch tut im Grunde so etwas.

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

Antwort

7

denke ich, das Problem in der Leitung ist

if datetime.now() == payment_date: 

, die buchstäblich, wenn die payment_date zu sehen ist jetzt. Ich glaube, Sie sehen wollen, jetzt, wenn größer oder gleich dem payment_date, in welchem ​​Fall Sie

if datetime.now() >= payment_date: 

Sie auch Filter verwenden sollten, können nur die Rechnungen, wenn Sie die Datenbank abfragen:

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

Update

Ihr Code ist falsch, weil Sie sich gegenseitig ausschließende Bedingungen haben. Schauen Sie:

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

Das erste überprüft, ob payment_date bevor jetzt. Dann setzt es owing zu invoice_gross. Dann, in der gleichen Bedingung, es überprüft, ob payment_date ist nach jetzt.Aber das kann nicht sein! Sie sind nur in diesem Codeblock, wenn payment_date jetzt vor ist!

Ich glaube, Sie haben eine Vertiefung Fehler, und wollen Sie stattdessen:

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

Was natürlich, ist die gleiche wie:

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

wenn ich „, wenn datetime.now ändern> = payment_date: "Ich bekomme diesen Fehler kann datetime.date nicht mit builtined_function_or_method vergleichen – Shehzad009

+1

' datetime.now' ist eine Funktion, rufe sie mit 'datetime.now()' – crodjer

+0

Zurück auf meinem Computer. Es funktioniert immer noch nicht richtig. Sehen Sie sich den neuesten Code an. – Shehzad009

9

Verwenden Sie datetime.now() (beachten Sie die Parens). Ansonsten denken Sie daran, dass das Feld immer ein datetime Objekt sein wird. Auch, (ich schätze das) sollten Sie nur das Datum des datetime überprüfen, um das gegenwärtige Datum zusammenzubringen (oder es wird nur diese spezifische Sekunde zusammenbringen). Dafür müssen Sie, wenn payment_date.date() == date.today() überprüfen (wo datedatetime.date ist)

Das bedeutet auch, dass Sie wie folgt filtern: Invoice.objects.filter(payment_date__lte=datetime.now()).

__lte, __gte, __lt werden __gt verwendet für <=, >=, < und >