2009-08-14 17 views
0

Kann mich jemand zu einem Tutorial, Code oder eine Art Ressource, die mir mit dem folgenden Problem helfen.Django - SQL Query - Timestamp

Ich habe eine Tabelle in einer MySQL-Datenbank. Es enthält eine ID, einen Timestamp, eine andere ID und einen Wert. Ich übergebe es die "Haupt" ID, die ein Stück Daten eindeutig identifizieren kann. Ich möchte jedoch eine Zeit Suche auf diesem Stück Daten (daher mit dem Timestamp-Feld). Daher wäre es ideal zu sagen: zwischen den Stunden von 12 und 1, zeigen Sie mir alle Werte für ID = 1987.

Wie würde ich gehen, dies in Django abzufragen? Ich weiß in mySQL, dass es etwas weniger als/größer als usw. ist ... aber wie würde ich das in Django machen? Ich habe Object.Filter für den größten Teil der Datenbankhandhabung bisher verwendet. Abschließend möchte ich betonen, dass ich neu in Django bin und ehrlich gesagt ratlos bin!

+0

Bitte schreiben Sie den Code für Ihre Tabelle. –

+0

In der Minute arbeitslos und leider haben die Dateien nicht auf mich! Ich werde alle Antworten testen Montag kommen! – Federer

Antwort

2

Ich glaube nicht, Vinay Sajip's Antwort ist richtig. Die nächstgelegene richtige Variante auf seinem Code basierte:

MyModel.objects.filter(
         primaryid=1987 
        ).exclude(
         timestamp__lt=min_timestamp 
        ).exclude(
         timestamp__gt=max_timestamp 
        ).values_list('valuefield', flat=True) 

Das ist „diejenigen ausschließen weniger als die minimalen Zeitstempel und schließen diejenigen, größer als der maximale Zeitstempel.“ Alternativ können Sie dies tun:

MyModel.objects.filter(
         primaryid=1987 
        ).filter(
         timestamp__gte=min_timestamp 
        ).exclude(
         timestamp__gte=max_timestamp 
        ).values_list('valuefield', flat=True) 

auszuschließen sind() und filter() Gegensätze sind: auszuschließen sind() lässt die identifizierten Zeilen und Filter() enthält sie. Sie können eine Kombination von ihnen verwenden, um je nachdem, was Sie bevorzugen, ein- oder auszuschließen. In Ihrem Fall möchten Sie() diejenigen unter Ihrem Mindest-Zeitstempel ausschließen und() über dem maximalen Zeitstempel ausschließen.

Hier ist die Dokumentation auf chaining QuerySet filters.

+0

arbeitete wie ein Charme! Danke! – Federer

+0

Hoppla! Das funktioniert tatsächlich nicht. Es schließt die angegebenen Zeitstempel aus, aber nicht kleiner oder größer als. Ich bekomme nur eine Fehlermeldung, dass das Feld nicht in meiner Datenbank ist. Wie im ursprünglichen Beitrag erwähnt, habe ich nur ein Zeitstempelfeld, um einen Wert anzugeben. Daher ist die Antwort falsch. – Federer

+0

Nein, korrigiere ich mich wieder. Ich habe den doppelten Unterstrich nicht eingeschlossen, nur eine einzige! Nochmals vielen Dank! :) – Federer

3

Wenn die fragliche Tabelle einem Django-Modell MyModel, z.

class MyModel(models.Model): 
    ... 
    primaryid = ... 
    timestamp = ... 
    secondaryid = ... 
    valuefield = ... 

dann können Sie

MyModel.objects.filter(
         primaryid=1987 
        ).exclude(
         timestamp__lt=<min_timestamp> 
        ).exclude(
         timestamp__gt=<max_timestamp> 
        ).values_list('valuefield', flat=True) 

Dies wählt Einträge mit dem primaryid 1987 mit Zeitwerten zwischen <min_timestamp> und <max_timestamp>, verwenden und gibt die entsprechenden Werte in einer Liste.

Aktualisierung: Korrigierter Fehler in der Abfrage (filter ->exclude).

+0

Hey, Vinay, ich habe das von dir abgeleitet, also werde ich das verbessern. Vielen Dank! – hughdbrown

+0

Ja, ich habe auf dem zweiten Zeitstempel-Filter getäuscht. Danke, dass du es gesehen hast! –