[英]django dynamic custom queryset
我有一个表来存储视图事件,也就是说,如果用户查看一个实体,一条记录将存储到该表中。 该表由具有通用关系的模型表示,也就是说,它可以与任何其他模型相关。
我已经定义了一个 mixin ViewTracked
,它应该由任何可以跟踪的模型(即class SomeModel(ViewTracked)
)扩展。
例如,我想要一个名为custom_method
的objects
管理器查询集的自定义方法。 我知道我可以定义一个自定义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.