Example #1
0
    def __iter__(self):
        pk = self.queryset.model._meta.pk
        if not isinstance(pk, (IntegerField, AutoField)):
            for result in iter(IterableQuerySetWrapper(self.queryset, self.step, self.limit)):
                yield result
        else:
            if self.min_id is not None and self.max_id is not None:
                at, max_id = self.min_id, self.max_id
            else:
                at = self.queryset.aggregate(Min('pk'), Max('pk'))
                max_id, at = at['pk__max'], at['pk__min']
                if self.min_id:
                    at = self.min_id
                if self.max_id:
                    max_id = self.max_id

            if not (at and max_id):
                return

            num = 0
            limit = self.limit or max_id

            if isinstance(self.queryset, RangeQuerySet):
                extra_kwargs = {'bypass': True}
            else:
                extra_kwargs = {}

            while at <= max_id and (not self.limit or num < self.limit):
                results = self.queryset.filter(id__gte=at, id__lte=min(at+self.step-1, max_id))
                if self.sorted:
                    results = results.order_by('id')
                results = results.iterator(**extra_kwargs)
                if self.select_related:
                    # we have to pull them all into memory to do the select_related
                    results = list(results)
                    for fkey in self.select_related:
                        if '__' in fkey:
                            fkey, related = fkey.split('__')
                        else:
                            related = []
                        attach_foreignkey(results, getattr(self.queryset.model, fkey, related))

                for result in results:
                    yield result
                    num += 1
                    if num >= limit:
                        break
                at += self.step
Example #2
0
    def __iter__(self):
        pk = self.queryset.model._meta.pk
        if not isinstance(pk, (IntegerField, AutoField)):
            for result in iter(
                    IterableQuerySetWrapper(self.queryset, self.step,
                                            self.limit)):
                yield result
        else:
            max_id = self.max_id
            if self.min_id is not None:
                at = self.min_id
            elif not self.sorted:
                at = 0
            else:
                at = None

            num = 0
            limit = self.limit or max_id

            if isinstance(self.queryset, RangeQuerySet):
                extra_kwargs = {'bypass': True}
            else:
                extra_kwargs = {}

            has_results = True
            while ((max_id and at <= max_id)
                   or has_results) and (not self.limit or num < self.limit):
                start = num

                if at is None:
                    results = self.queryset
                elif self.desc:
                    results = self.queryset.filter(id__lte=at)
                elif not self.desc:
                    results = self.queryset.filter(id__gte=at)

                # Adjust the sort order if we're stepping through reverse
                if self.sorted:
                    if self.desc:
                        results = results.order_by('-id')
                    else:
                        results = results.order_by('id')

                if self.max_id:
                    results = results.filter(id__lte=max_id)

                results = results[:self.step].iterator(**extra_kwargs)
                if self.select_related:
                    # we have to pull them all into memory to do the select_related
                    results = list(results)
                    for fkey in self.select_related:
                        if '__' in fkey:
                            fkey, related = fkey.split('__')
                        else:
                            related = []
                        attach_foreignkey(
                            results, getattr(self.queryset.model, fkey,
                                             related))

                if self.callbacks:
                    results = list(results)
                    for callback in self.callbacks:
                        callback(results)

                for result in results:
                    yield result
                    num += 1
                    at = result.id
                    if (max_id and result.id >= max_id) or (limit
                                                            and num >= limit):
                        break

                if at is None:
                    break

                has_results = num > start
                if self.desc:
                    at -= 1
                else:
                    at += 1
Example #3
0
    def __iter__(self):
        pk = self.queryset.model._meta.pk
        if not isinstance(pk, (IntegerField, AutoField)):
            for result in iter(IterableQuerySetWrapper(self.queryset, self.step, self.limit)):
                yield result
        else:
            max_id = self.max_id
            if self.min_id is not None:
                at = self.min_id
            elif not self.sorted:
                at = 0
            else:
                at = None

            num = 0
            limit = self.limit or max_id

            if isinstance(self.queryset, RangeQuerySet):
                extra_kwargs = {'bypass': True}
            else:
                extra_kwargs = {}

            has_results = True
            while ((max_id and at <= max_id) or has_results) and (not self.limit or num < self.limit):
                start = num

                if at is None:
                    results = self.queryset
                elif self.desc:
                    results = self.queryset.filter(id__lte=at)
                elif not self.desc:
                    results = self.queryset.filter(id__gte=at)

                # Adjust the sort order if we're stepping through reverse
                if self.sorted:
                    if self.desc:
                        results = results.order_by('-id')
                    else:
                        results = results.order_by('id')

                if self.max_id:
                    results = results.filter(id__lte=max_id)

                results = results[:self.step].iterator(**extra_kwargs)
                if self.select_related:
                    # we have to pull them all into memory to do the select_related
                    results = list(results)
                    for fkey in self.select_related:
                        if '__' in fkey:
                            fkey, related = fkey.split('__')
                        else:
                            related = []
                        attach_foreignkey(results, getattr(self.queryset.model, fkey, related))

                if self.callbacks:
                    results = list(results)
                    for callback in self.callbacks:
                        callback(results)

                for result in results:
                    yield result
                    num += 1
                    at = result.id
                    if (max_id and result.id >= max_id) or (limit and num >= limit):
                        break

                if at is None:
                    break

                has_results = num > start
                if self.desc:
                    at -= 1
                else:
                    at += 1