如何通过Django中的RelatedManager访问“调用”对象?

2 投票
1 回答
616 浏览
提问于 2025-04-15 19:10

假设我有一个模型,它和Django的用户系统有个外键关联:

class Something(models.Model):

    user = models.ForeignKey(User, related_name='something')

我可以通过一个叫做RelatedManager的东西来访问这个模型:

u = User.objects.create_user('richardhenry', 'richard@example.com', 'password')
u.something.all()

我的问题是,如果我创建一个叫做SomethingManager的管理器,并在里面定义一些方法:

class SomethingManager(models.Manager):

    def do_something(self):
        pass

那么在do_something()这个方法里,能不能获取到原来的用户对象(也就是变量u)?(我不是想通过方法参数传递进来,而是想通过相关管理器获取。)

1 个回答

2

管理者(Managers)只和他们管理的模型直接连接。所以在这个例子中,你的管理者会连接到某个东西(Something),但不会直接连接到用户(User)。

另外,管理者一开始是处理查询集(querysets),而不是具体的对象,所以你需要从查询集开始工作。

记住,要在相关管理者(RelatedManager)中使用你自定义的方法,你需要在你的管理者里设置 use_for_related_fields = True

所以,要获取用户,你需要绕个弯,先获取对象,再获取用户:

def do_something(
    ids = self.get_query_set().values_list('user__id', flat=True)
    return User.objects.filter(id__in=ids).distinct()

上面的代码应该只返回一个用户,你可以在最后加上 .get() 来获取对象,而不是查询集,但我更喜欢返回查询集,因为这样可以继续链式调用。

撰写回答