Проблемы с производительностью объекта F () в Django - PullRequest
1 голос
/ 08 апреля 2010

Кто-нибудь еще замечал проблемы с производительностью при использовании объекта F () в Django? Я использую Windows XP с пакетом обновления 3 (SP3) и работаю против магистрали Django. Ниже приведен фрагмент моделей, которые я использую, и строящийся запрос. Когда у меня есть объект F (), каждый вызов метода QuerySet (например, filter, exclude, order_by, Different и т. Д.) Занимает примерно 2 секунды, но когда я закомментирую предложение F (), вызовы будут второй. У меня был сотрудник, который тестировал его на его машине с Ubuntu, и он не испытывает тех же проблем с производительностью, что и я с предложением F ().

Кто-нибудь еще видел такое поведение?

class Move (models.Model):
    state_meaning = models.CharField(
        max_length=16,
        db_index=True,
        blank=True,
        default=''
    )
    drop = models.ForeignKey(
        Org,
        db_index=True,
        null=False,
        default=1,
        related_name='as_move_drop'
    )

class Split(models.Model):
    state_meaning = models.CharField(
        max_length=16,
        db_index=True,
        blank=True,
        default=''
    )
    move = models.ForeignKey(
        Move,
        related_name='splits'
    )
    pickup = models.ForeignKey(
        Org,
        db_index=True,
        null=False,
        default=1,
        related_name='as_split_pickup'
    )
    pickup_date = models.DateField(
        null=True,
        default=None
    )
    drop = models.ForeignKey(
        Org,
        db_index=True,
        null=False,
        default=1,
        related_name='as_split_drop'
    )
    drop_date = models.DateField(
        null=True,
        default=None,
        db_index=True
    )

def get_splits(begin_date, end_date):
    qs = Split.objects \
        .filter(state_meaning__in=['INPROGRESS','FULFILLED'],
                drop=F('move__drop'), # <<< the line in question
                pickup_date__lte=end_date)

    elapsed = timer.clock() - start
    print 'qs1 took %.3f' % elapsed
    start = timer.clock()

    qs = qs.filter(Q(drop_date__gte=begin_date) |
                   Q(drop_date__isnull=True))

    elapsed = timer.clock() - start
    print 'qs2 took %.3f' % elapsed
    start = timer.clock()

    qs = qs.exclude(move__state_meaning='UNFULFILLED')

    elapsed = timer.clock() - start
    print 'qs3 took %.3f' % elapsed
    start = timer.clock()

    qs = qs.order_by('pickup_date', 'drop_date')

    elapsed = timer.clock() - start
    print 'qs7 took %.3f' % elapsed
    start = timer.clock()

    qs = qs.distinct()

    elapsed = timer.clock() - start
    print 'qs8 took %.3f' % elapsed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...