如何通过Django中的RelatedManager访问“调用”对象?
假设我有一个模型,它和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() 来获取对象,而不是查询集,但我更喜欢返回查询集,因为这样可以继续链式调用。