У меня есть повторяющийся шаблон в моем коде, где модель имеет связанную модель (один ко многим), которая отслеживает ее историю / статус.Эта связанная модель может иметь много объектов, представляющих моментальный снимок состояния модели.
Например:
class Profile(models.Model):
pass
class Subscription(models.Model):
profile = models.ForeignKey(Profile)
data_point = models.IntegerField()
created = models.DateTimeField(default=datetime.datetime)
#Example objects
p = Provile()
subscription1 = Subscription(profile=p, data_point=32, created=datetime.datetime(2011, 7 1)
subscription2 = Subscription(profile=p, data_point=2, created=datetime.datetime(2011, 8 1)
subscription3 = Subscription(profile=p, data_point=3, created=datetime.datetime(2011, 9 1)
subscription4 = Subscription(profile=p, data_point=302, created=datetime.datetime(2011, 10 1)
Мне часто приходится запрашивать эти модели, чтобы найти всеОбъекты «Профиль», которые не обновлялись по подписке в течение последних 3 дней или аналогичные.Для этого я использовал запросы на выборку:
q = Subscription.objects.filter(created__gt=datetime.datetime.now()-datetime.timedelta(days=3).values('id').query
Profile.objects.exclude(subscription__id__in=q).distinct()
Проблема в том, что это очень медленно, когда задействованы большие таблицы.Есть ли более эффективный шаблон для такого запроса?Может быть, какой-нибудь способ заставить Django использовать JOIN вместо SUBSELECT (похоже, поможет избавиться от всех этих внутренних вложенных циклов)?
Мне бы хотелось использовать ORM, но при необходимости я быготов использовать метод .extra () или даже необработанный SQL, если повышение производительности достаточно убедительно.
Я работаю с Django 1.4alpha (SVN Trunk) и Postgres 9.1.