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

如何使用Django中的相关名称从与第三个表有关系的两个不同表中获取对象?

  •  0
  • darkhorse  · 技术社区  · 6 年前

    让我解释一下。我有两个表是另一个抽象表的子类。抽象表与名为 Foo . 这个 related_name 是动态设置的。代码如下所示:

    class Foo(models.Model):
        ...
    
    class Parent(models.Model):
        foo = models.ForeignKey(
            Foo,
            on_delete=models.CASCADE,
            related_name='%(app_label)s_%(class)s_related'
        )
        ...
    
        def bar(self):
            print('bar')
    
        class Meta:
            abstract = True
    
    class ChildOne(Parent):
        ...
    
    class ChildTwo(Parent):
        ...
    

    因此,相关名称成为 'myapp_childone_related' ,和 'myapp_childtwo_related' .

    现在,假设我想打电话给 bar() 方法中的所有对象 ChildOne ChildTwo 对象。不过有一个问题,我想用 模型。目前,我是这样做的:

     class Foo(models.Model):
         ...
    
         def call_bar(self):
             references = ('childone', 'childtwo')
             for ref in references:
                 children = getattr(self, f'myapp_{ref}_related').all()
                 for child in children:
                     child.bar()
    

    这很好,但老实说,感觉有点黑客,尤其是当处理两个以上的儿童班。有没有一个更好的,更能解决这个问题的方法?

    编辑:我决定不提之前我想打电话给 条形图() 方法中的类方法 因为我认为这个问题没有必要。然而,Daneil Roseman的回答建议创建一个类列表,这是一个很好的解决方案,但是它在class方法中不起作用,因为类在模块中还没有被定义。所以在这次编辑中提到了这一点。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Daniel Roseman    6 年前

    相关的\u名称只是从相关类本身执行查询的语法糖。所以你应该明确地这样做:

    child_classes = [ChildOne, ChildTwo]
    for child_class in child_classes:
        children = child_class.objects.filter(foo=foo)