My modified version of the MultiQuerySet by mattdw (see the link for further information).
My purpose for this was to enable me to combine multiple different types of querysets together, which could then be iterated on as one object (i.e. like a tumblelog).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | class MultiQuerySet(object):
def __init__(self, *args, **kwargs):
self.querysets = args
self._count = None
def _clone(self):
querysets = [qs._clone() for qs in self.querysets]
return MultiQuerySet(*querysets)
def __repr__(self):
return repr(list(self.querysets))
def count(self):
if not self._count:
self._count = sum([qs.count() for qs in self.querysets])
return self._count
def __len__(self):
return self.count()
def __iter__(self):
for qs in self.querysets:
for item in qs.all():
yield item
def __getitem__(self, item):
indices = (offset, stop, step) = item.indices(self.count())
items = []
total_len = stop - offset
for qs in self.querysets:
if len(qs) < offset:
offset -= len(qs)
else:
items += list(qs[offset:stop])
if len(items) >= total_len:
return items
else:
offset = 0
stop = total_len - len(items)
continue
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 8 months, 4 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 9 months ago
- Serializer factory with Django Rest Framework by julio 1 year, 3 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 4 months ago
- Help text hyperlinks by sa2812 1 year, 5 months ago
Comments
It would be nice to have these generated transparently:
#
I've fixed a bug in the code that occurred with small querysets on pages > 1, the length of former queryset was substracted from the offset, but not from the stop, resulting in variable length pages
#
Please login first before commenting.