【问题标题】:Override djangos's object.all() with the request data用请求数据覆盖 djangos 的 object.all()
【发布时间】:2011-06-26 23:35:43
【问题描述】:

我想根据会话中的信息覆盖特定模型的objects.all() 的行为,但我不知道当时如何获取会话数据

谢谢

编辑 只是对我这样做/为什么这样做的更多解释。我们有一个项目,但想根据用户登录的内容对用户可以看到的内容应用过滤器。所以它可以影响“all()”的工作方式。我们的项目已经构建并且我们正在对其进行修改,因此我们不想经历并更改所有objects.all() 并添加请求。希望这能解决问题

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    您应该为此在自定义管理器上创建一个方法:

    from django.db import models
    
    class MyManager(models.Manager):
        def all(self, session=None):
            if session is None:
                return self.all()
            else:
                return self.filter(.....)
    
    class MyModel(models.Model):
        # fields go here
        objects = MyManager()
    

    虽然这可能不是推荐的方法,因为它会改变 all() 的行为,这可能会对您应用的其他部分产生一些意想不到的影响! 或者,您可以为此向管理器添加一个 NEW 方法,或者在视图中进行一些额外的过滤:

    # code in the view
    qs = MyModel.objects.all()
    if session....:
        qs = qs.filter(...)
    

    但是你总是需要传递必要的数据给你的过滤方法!考虑到该方法也可能从无法访问请求/会话数据的位置(例如 shell)中调用,因此一个好的架构需要这个!

    【讨论】:

    • 我现在已经编辑了这个问题,我们想要实现它,所以它可以无形地工作,所以我们不必更改一些已经编写的代码。不过,这可能必须是我们的解决方案!谢谢你的回答
    • 这将进入一个无限递归调用,all 调用all
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2012-07-18
    • 2011-01-03
    相关资源
    最近更新 更多