django - 使用装饰器更改 django 模型 '.objects' 的管理器

标签 django

我正在尝试编写一个装饰器来更改 django 模型的管理器,如下所示:

def custom_manager(*args):
    class CustomManager(models.Manager):
        pass
    def wrapper(cls):
        cls.add_to_class('objects', CustomManager())
        return cls
    return wrapper

@custom_manager()
class SomeModel(models.Model):
    pass

问题似乎是objects属性已被默认管理器采用,必须先从模型中删除它。简单地在装饰器中设置 cls.objects = CustomManager() 也不起作用。

如果我使用一些未使用的属性名称(即不是 objects ),一切正常,但我想完全替换 objects属性使所有应用程序(例如 DjangoAdmin 等)使用此自定义管理器。

那么有没有办法从模型中正确删除默认管理器或以其他方式修复它?

最佳答案

我觉得应该是这样的:

def custom_manager(cls):
  class CustomManager(models.Manager):
    pass

  cls.objects= CustomManager()
  return cls


@custom_manager()
class SomeModel(models.Model):
    pass

关于django - 使用装饰器更改 django 模型 '.objects' 的管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49864115/

相关文章:

javascript - 具有 ajax 请求和 python 交互的 Google 应用引擎

python - 如何在 Python 中将 datetime.timedelta 转换为分钟、小时?

Django:在 ManyToManyField 中获取属于模型对象的第一个项目

django - 上传前在 Django 中验证文件名

django - 是否有计划通过 IIS 正式支持 Django?

python - Django 分组依据

django - Apache Solr搜索一词的一部分

html - 为什么我的导航栏扩展不正确?

python - 如何在 Django 模型中编写方法来检索相关对象?

django - 在 Heroku 中将 wwwhisper 用于 Django 应用程序