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

时间:2010-02-11 20:30:09

标签: python django

假设我有一个带有Django Auth用户外键的模型:

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

是否可以在u方法中获取原始User对象(如变量do_something())? (通过相关的经理;通过方法args传递它不是我想要的。)

1 个答案:

答案 0 :(得分:2)

经理只与他们管理的模型直接相关。因此,在这种情况下,您的经理将连接到Something,但不会直接连接到User。

此外,管理员从查询集开始,而不是从对象开始,因此您必须从那里开始工作。

请注意,要将自定义方法与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()来获取对象而不是查询集,但我喜欢返回查询集,因为你可以继续链接它们。