2014-01-09 3 views
6

Mein Modell haben 3 FelderDjango - Abfrage für die Zeilen zu geben, wo eine Spalte Nicht auf eine andere Spalte in demselben Modell entspricht

class Table(models.Model): 
    in_time = models.DateTimeField(null=True, blank=True) 
    actual_time = models.DateTimeField(null=True, blank=True) 

i Ergebnisse auf diese Weise holen wollen:

select * from Table where in_time > '2013-12-31 00:00:00' and in_time != actual_time 

So kann mir jemand helfen, dieses

result = Table.objects.filter(in_time__gte = '2013-12-31 00:00:00') 

Antwort

4

Verwenden Q mit ~ operat in Vollendung oder negierten (NOT) Abfrage zu erstellen:

import datetime 
from django.db.models import Q, F 

Table.objects.filter(~Q(in_time=F('actual_time')), 
        in_time__gt=datetime.datetime(2013,12,31)) 

Und F referenzieren Felder auf demselben Modell:

Django F Ausdrücke bietet solche Vergleiche zu ermöglichen. Instanzen von F() fungieren als Referenz auf ein Modellfeld innerhalb einer Abfrage. Diese Referenzen können dann in Abfragefiltern verwendet werden, um die Werte von zwei verschiedene Felder auf der gleichen Modellinstanz zu vergleichen.

+0

@ ProfHase85 was für einen Unterschied in perfomance zwischen Filter und Filter mit Q-Klasse ausschließen verwenden? – ndpu

+0

Entschuldigung, meine Schuld, habe es einfach falsch verstanden. Es gibt keinen offensichtlichen Leistungsunterschied. Noch eine extra Klasse für eine Abfrage zu initialisieren (wenn es eine Möglichkeit gibt, dies ohne die Q-Klasse durchzuführen) scheint mühsam. (Aber es ist nur eine Frage des Geschmacks) – ProfHase85