Форум сайта python.su
Имеем следующие две модели:
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')
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
Офлайн
isnull
Takes either True or False, which correspond to SQL queries of IS NULL and IS NOT NULL, respectively.
Example:
Entry.objects.filter(pub_date__isnull=True)
SELECT ... WHERE pub_date IS NULL;
Офлайн
terabayt, я знаю, что такое isnull. Вопрос не в этом.
Офлайн
Тогда в чем? Объясните непосвященному))
наведите пример, что вы хотите получить и что вас не устраивает.
Офлайн
Вот при такой выборке:
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)
AND "temp_modela"."date" IS NOT NULL
Отредактировано int_0x80 (Июль 14, 2014 19:27:22)
Офлайн
int_0x80а как же
Ведь я этого не указывал.
null=True
Отредактировано terabayt (Июль 14, 2014 20:15:07)
Офлайн
А почему тогда если применить вместо exclude - filter, то это условие не вставляется?
ModelB.objects.select_related().filter(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 "temp_modela"."date" BETWEEN '2010-01-01 00:00:00+00:00' and '2014-01-01 00:00:00+00:00'
Офлайн
Может нужно основы дискретной математики почитать?!
при exclude используется “если не в диапазоне, то катит”, а в filter “если в диапазоне, то катит”. а так как вы написали null=True, то и пустые значения удовлетворяют. если будет null=False, то тогда уже будет отсеиватся, тоесть будет
... WHERE ("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)
Офлайн
.exclude(Q(a__date__range=('2010-01-01', '2014-01-01')))
Офлайн