【问题标题】:Django: How to access originating instance from a RelatedManager?Django:如何从 RelatedManager 访问原始实例?
【发布时间】:2009-10-02 18:56:34
【问题描述】:

我想在我的经理方法baz 中访问Foo 实例foo

foo.bar_set.baz()

baz 通常会采用Foo 类型的参数:

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 会有一个指向 Foo 的 ForeignKey:

class Bar(models.Model):
    foo = models.ForeignKey(Foo)
    objects = BarManager()

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    如果我正确理解您想要的内容,您需要这样做:

     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
    

    【讨论】:

    • 不,没必要。 baz 方法已经在 Foo.bar_set 上可用
    【解决方案2】:

    至少在 Django 2.1 中,您可以简单地这样做:

    foo.bar_set.instance

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 2019-11-18
      相关资源
      最近更新 更多