繁体   English   中英

django 动态自定义查询集

[英]django dynamic custom queryset

我有一个表来存储视图事件,也就是说,如果用户查看一个实体,一条记录将存储到该表中。 该表由具有通用关系的模型表示,也就是说,它可以与任何其他模型相关。

我已经定义了一个 mixin ViewTracked ,它应该由任何可以跟踪的模型(即class SomeModel(ViewTracked) )扩展。

例如,我想要一个名为custom_methodobjects管理器查询集的自定义方法。 我知道我可以定义一个自定义Manager并轻松地用它覆盖objects管理器,但问题是跟踪模型已经可以有一个自定义管理器,它有自己的自定义查询集,所以我不能简单地覆盖它并丢失它具有的自定义查询集。

不幸的是,我找不到合适的方法来执行此操作,因此我尝试添加一个元类来覆盖管理器的get_queryset并将我的自定义方法添加到其中,但由于某种原因,当我调用SomeModel.objects时它总是返回None

这是我尝试过的:

# Meta class
class ViewTrackedMeta(ModelBase):
    def __new__(mcs, class_name, base_classes, attributes_dict):
        # let ModelBase do its magic
        new_class = super().__new__(mcs, class_name, base_classes, attributes_dict)
        if hasattr(new_class, 'objects'):
            objects_manager = new_class.objects
            if isinstance(objects_manager, Manager):
                queryset = objects_manager.get_queryset()

                def custom_method(queryset):
                    return queryset.filter(...)

                def get_extended_queryset(manager):
                    queryset.custom_method = types.MethodType(custom_method, queryset)
                objects_manager.get_queryset = types.MethodType(get_extended_queryset, objects_manager)
        return new_class

# Mixin
class ViewTracked(Model, metaclass=ViewTrackedMeta):
    class Meta:
        abstract = True
    ...

# Models
class SomeModel(ViewTracked):
    objects = CustomManager()


class SomeOtherModel(ViewTracked):
    ... # default django objects manager


class SomeOtherModel(ViewTracked):
    objects = OtherCustomManager()

有没有其他方法可以实现我想要的? 为什么SomeModel.objects总是返回None

除了实例化您的管理器类之外,您应该使用from_queryset 这是文档

class CustomQuerySet(models.QuerySet):
    def manager_and_queryset_method(self):
        return

class MyModel(models.Model):
    objects = models.Manager.from_queryset(CustomQuerySet)()

现在你可以这样做:

MyModel.objects.manager_and_queryset_method()

MyModel.objects.filter(something="else").manager_and_queryset_method()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM