用请求数据重写Django的object.all()
我想根据会话中的信息,改变某个模型的 objects.all()
的行为,但我不知道在那个时候怎么获取会话数据。
谢谢。
编辑
再多解释一下我为什么要这么做。我们有一个项目,但想根据用户登录的信息,给他们看到的内容加个过滤器。所以改变 all()
的工作方式是可以的。我们的项目已经搭建好了,现在只是想修改一下,不想逐个去改所有的 objects.all()
,然后再加上请求。希望这样能让事情更清楚。
1 个回答
-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(...)
但是你总是需要将必要的数据传递给你的过滤方法!要考虑到,这个方法可能会在没有请求/会话数据访问权限的地方被调用(比如在命令行中),因此一个好的架构设计是必须的!