python类ModelIterable()的实例源码

patch.py 文件源码 项目:django-eraserhead 作者: dizballanze 项目源码 文件源码 阅读 29 收藏 0 点赞 0 评论 0
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
managers.py 文件源码 项目:geekpoint 作者: Lujinghu 项目源码 文件源码 阅读 22 收藏 0 点赞 0 评论 0
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


问题


面经


文章

微信
公众号

扫码关注公众号