2011-06-26 32 views
0

我要重写的特定型号的objects.all()基于信息的行为是在会话中,我不知道如何在这一点上获取会话数据的请求数据覆盖Django的的object.all()与

感谢

编辑 只是更多的是什么/为什么IM这样的解释了一下。我们有一个项目,但希望根据用户登录的内容将过滤器应用于用户可以看到的内容。所以它可以影响“all()”的工作方式。我们的项目已经建成,我们正在修改它,所以我们不想通过并更改所有objects.all()并添加请求。希望这将清除的东西了

回答

-2

你应该做一个方法上的自定义管理器,为的是:

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()可能有一些行为意想不到的效果在你的应用的其他部分! 另外,您既可以一个新的方法添加到管理员为了这个目的,或者做一些额外的过滤视图:

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

但你总是需要必要的数据,以您的过滤方法!考虑这个方法也可能从一个无法访问请求/会话数据的位置(例如shell)调用,因此一个好的体系结构要求这样!

+0

我现在编辑了这个问题,我们想实现这个,所以它工作在不可见的状态,所以我们不必改变一些已经写好的代码。这可能必须是我们的解决方案!感谢您的回答 – neolaser

+1

这将进入一个无限递归调用,'all'调用'all'。 – Gocht