from django.db import models class ModelA(models.Model): date = models.DateTimeField(null=True, default=None) class ModelB(models.Model): a = models.OneToOneField(ModelA, related_name='modela')
И нужно отфильтровать данные, не входящих в определенный диапазон date. Так и пишем:
ModelB.objects.select_related().exclude(Q(a__date__range=('2010-01-01', '2014-01-01')))
SELECT "temp_modelb"."id", "temp_modelb"."a_id", "temp_modela"."id", "temp_modela"."date" FROM "temp_modelb" INNER JOIN "temp_modela" ON ( "temp_modelb"."a_id" = "temp_modela"."id" ) WHERE NOT ("temp_modela"."date" BETWEEN '2010-01-01 00:00:00+00:00' and '2014-01-01 00:00:00+00:00' AND "temp_modela"."date" IS NOT NULL) LIMIT 21
Вопрос в том, откуда взялось условие:
AND "temp_modela"."date" IS NOT NULL
Выяснил, что это условие подставляется, если у поля выставлен флаг null=True.
Как избавится от этого условия не прибегая к raw sql?