【问题标题】:How can you access the "calling" object through a RelatedManager in Django?如何通过 Django 中的 RelatedManager 访问“调用”对象?
【发布时间】:2010-02-11 20:30:09
【问题描述】:

假设我有一个带有 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

是否可以在do_something() 方法中获取原始用户对象(如变量u)? (通过相关的管理器;通过方法 args 传递它不是我所追求的。)

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

    请记住,要将自定义方法与 RelatedManager 一起使用,您需要在 Manager 中设置 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() 来获取对象而不是查询集,但我喜欢返回查询集,因为你可以继续链接它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 2011-01-19
      • 2013-11-22
      • 2017-03-04
      • 2012-02-23
      • 1970-01-01
      相关资源
      最近更新 更多