def patch_queryset():
""" Patch QuerySet """
# Patch `ModelIterable.__iter__` method
@funcy.monkey(query.ModelIterable)
def __iter__(self):
tb = traceback.extract_stack()
queryset_storage = QuerySetStorage(self.queryset, tb)
current_request_storage.add_queryset_storage_instance(queryset_storage)
iterator = __iter__.original(self)
for model_instance in iterator:
wrapped_model_instance = ModelInstanceWrapper(model_instance)
queryset_storage.add_wrapped_model_instance(wrapped_model_instance)
yield wrapped_model_instance
python类ModelIterable()的实例源码
def __iter__(self):
queryset = self.queryset
iter = ModelIterable(queryset)
if getattr(queryset, 'subclasses', False):
extras = tuple(queryset.query.extra.keys())
# sort the subclass names longest first,
# so with 'a' and 'a__b' it goes as deep as possible
subclasses = sorted(queryset.subclasses, key=len, reverse=True)
for obj in iter:
sub_obj = None
for s in subclasses:
sub_obj = queryset._get_sub_obj_recurse(obj, s)
if sub_obj:
break
if not sub_obj:
sub_obj = obj
if getattr(queryset, '_annotated', False):
for k in queryset._annotated:
setattr(sub_obj, k, getattr(obj, k))
for k in extras:
setattr(sub_obj, k, getattr(obj, k))
yield sub_obj
else:
for obj in iter:
yield obj