2014-07-03 12 views
5

Ich versuche, ein Abfrage-Set zu erstellen, um die Werte eines DateTimeField abzurufen, das DATETIME in dem DB ist.DateTimeField-Abfrage-Set gibt None in Django zurück

Die Klasse in models.py:

class ChangeMetrics(models.Model): 
    id = models.IntegerField(primary_key=True) 
    file_id = models.ForeignKey(File, db_column = 'file_id') 
    version_id = models.ForeignKey(Version, db_column = 'version_id') 
    function_id = models.ForeignKey(Function, blank=True, db_column = 'function_id') 
    date = models.DateTimeField(blank=True, null=True) 
    user = models.TextField(blank=True) 
    changed = models.IntegerField(blank=True, null=True) 

Das Feld in der DB:

date DATETIME 

Die Tupel in der Datenbank aufgefüllt werden und Ausführen von SQL-Abfragen direkt auf dem DB perfekt funktionieren.

Dies ist queryset ich zur Zeit in Django bin mit:

queryset = ChangeMetrics.objects.filter(~Q(changed=None), ~Q(date=None), ~Q(version_id=None)) 

ich eine rohe Abfrage und auch eine Version der Abfrage versucht haben, die auszuschließen sind() verwendet, aber das gibt noch keine für Datum.

Ich greife auf die Einträge in der Abfrage über eine for-Schleife und einfach Zugriff auf Datum durch entry.date innerhalb der for-Schleife.

Bearbeiten: Django Version 1.6.5 Ich habe auch versucht, die Werte durch die Django-Shell, um keinen Erfolg zu bekommen.

Irgendwelche Ideen, was könnte falsch sein?

+0

Was passiert, wenn Sie nur die Nulldaten selbst abfragen? –

+0

Gleiches Ergebnis leider. –

Antwort

0

Können Sie bitte versuchen, diese Lösung:

queryset = list(ChangeMetrics.objects.filter(changed__isnull=False, date__isnull=False, version_id__isnull=False)) 
+0

Ich bekomme die gleichen Ergebnisse mit Ihrer Abfrage. Ich kann hinzufügen, dass die Abfrage die richtigen Tupel der DB zurückgibt, d. H. Diejenigen, die in den angegebenen Feldern nicht Null haben. Es ist nur, dass es den Wert des Datums aus irgendeinem Grund nicht abruft. –

+0

Bitte zeigen Sie Ihre volle models.py Ich meine volle 'ChangeMetrics' Klasse – Silwest

+0

fügen Sie obigen Kommentar in Ihre Frage bitte @ user3063424 – ruddra

0

EDIT: Versuchen Sie, die databse aus Ihrem Ordner zu verschieben, dann python manage.py syncdb laufen und prüfen Sie, ob Ihre Datenbank korrekt nach den Models erstellt wird.

funktioniert nicht: Vielleicht können Sie mit diesem versuchen (ich weiß nicht, ob es funktioniert, ich es nicht jetzt versuchen können):

queryset = ChangeMetrics.objects.filter(changed!=None, date!=None, version_id!=None) 
+0

Versucht es. Ich glaube nicht, dass es ein Problem mit der Abfrage selbst gibt ... Momentan denke ich, dass etwas an der Verknüpfung zwischen Modellen und Datenbank nicht stimmt. –

+0

Siehe bearbeiten, kann eine Möglichkeit sein zu erkennen, ob Modelle funktionieren –

+0

Versucht, dass. Und führte eine neue inspectdb> models.py, um eine neue models-Datei zu generieren, gibt immer noch keine zurück. Ich überprüfe Tabellengenerationen der DB jetzt, um zu sehen, ob der Fehler dort sein könnte. –

-1

Ich denke, Sie erzeugen (django migrieren Befehl) Ihr Datenbankschema auf dem Mac. Versuchen Sie, das Schema zu löschen und erneut von einem Windows-Computer zu migrieren.

3

nicht sicher, ob Sie in der Lage, dies herauszufinden, aber ich hatte nur dieses Problem und war in der Lage, es zu beheben.

Also Django-Migrationen erstellt die Spalte in der Datenbank als datetime (6) anstelle von datetime. Dies führte dazu, dass die Django-Modelle das Datetime-Objekt nicht instanziieren konnten.

ALTER TABLE `my_table` 
MODIFY COLUMN `created` datetime NOT NULL 

Nach dem Ausführen, wenn mein Problem behoben. Vielleicht könnten Sie in Ihrem Fall versuchen, stattdessen zu datetime (6) zu ändern.

+0

In meinem Fall war die Spalte nur 'datetime', aber trotzdem löste dies das Problem. Vielen Dank! – Tzach

2

Wir hatten das gleiche Popup-Problem, während wir den Code von der lokalen Umgebung (Mac OS X) auf App Engine schoben. Während wir die Felder, die Alexander als DATETIME anstelle von DATETIME (6) erwähnt hat, verändert haben, haben wir die Mikrosekunden verloren. Am Ende realisierten wir, dass wir in der lokalen Umgebung MySQLdb 1.2.5 ausführen, aber wenn wir in App Engine bereitstellen, obwohl wir "neuestes" als die Version von MySQLdb angegeben hatten, zog es nur 1.2.4b4, hardcoding 1.2.5 Das Problem wurde behoben.

+1

Ich stieß auf dieses Problem mit der gleichen lokalen/Produktionsumgebung. Deine Reparatur hat wie ein Zauber funktioniert. Wusste nicht, App-Engine zog 1.2.4b4 statt 1.2.5. Vielen Dank @jturmel! – taelimoh

0

Dieses Problem wird durch eine veraltete Version von MySQL-python nicht durch Django oder Migrations-System verursacht.

Mit mysqlclient (die eine aktualisierte Gabel von MySQL-python ist) löst dieses Problem.

Verwandte Themen