用请求数据重写Django的object.all()

0 投票
1 回答
1356 浏览
提问于 2025-04-16 20:20

我想根据会话中的信息,改变某个模型的 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(...)

但是你总是需要将必要的数据传递给你的过滤方法!要考虑到,这个方法可能会在没有请求/会话数据访问权限的地方被调用(比如在命令行中),因此一个好的架构设计是必须的!

撰写回答