2014-01-09 1 views
6

Моя модель имеет 3 поляДжанго - запрос для давать строки, в которых один столбец не равен другому столбцу в той же модели

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

я хочу, чтобы получить результаты таким образом:

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

Так может кто-нибудь мне помочь в заполнении этого

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

ответ

4

использование Q с ~ OPERAT или построить отрицание (NOT) запроса:

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

И F ссылаться на поля на тот же модели:

Django предоставляет F выражение для проведения таких сравнений. Экземпляры F() действуют как ссылка на поле модели в запросе. Эти ссылки затем могут использоваться в фильтрах запросов для сравнения значений двух разных полей в одном экземпляре модели.

+0

@ ProfHase85 какая разница в Perfomance между использованием исключающий фильтр и фильтрации с Q класса? – ndpu

+0

Извините, по моей вине, только что случилось. Нет очевидной разницы в производительности. Инициализация дополнительного класса для запроса (если есть способ выполнить это без класса Q) кажется громоздкой. (Но это всего лишь вопрос вкуса) – ProfHase85

Смежные вопросы