代码之家  ›  专栏  ›  技术社区  ›  muhuk

Django:如何从RelatedManager访问源实例?

  •  1
  • muhuk  · 技术社区  · 15 年前

    我想进入 Foo 实例 foo 在我的经理方法中 baz :

    foo.bar_set.baz()
    

    巴兹 通常会有一个争论 类型:

    BarManager(models.Manager):
        def baz(self, foo=None):
            if foo is None:
                # assume this call originates from
                # a RelatedManager and set `foo`.
                # Otherwise raise an exception
            # do something cool with foo
    

    这样,上面的第一个查询和下面的查询都可以相同地工作:

    Bar.objects.baz(foo)
    

    Bar 会有一把外国钥匙 :

    class Bar(models.Model):
        foo = models.ForeignKey(Foo)
        objects = BarManager()
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   oggy    15 年前

    如果我正确理解了你想要什么,你需要这样做:

     BarManager(models.Manager):
          use_for_related_fields = True
    

    编辑: 显然,我完全错过了这一点。你可以用这样的东西(也许对我来说太“魔法”了,但是哦,好吧):

    class BarManager(models.Manager):
        use_for_related_fields = True
    
        def bar(self, foo=None):
            if foo == None:
                qs = Foo.objects.all()
                for field_name, field_val in self.core_filters.items():
                    field_name = field_name.split('__')[1]
                    qs = qs.filter(**{ field_name: field_val })
                foo = qs.get()
            # do k00l stuff with foo
    
        2
  •  0
  •   C S    6 年前

    至少在Django 2.1中,您可以简单地执行以下操作:

    foo.bar_set.instance