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

时间:2019-04-03 18:22:08

标签: django django-models django-orm

让我解释一下。我有2个表,它们是另一个抽象表的子类。抽象表与名为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对象相关的所有对象的Foo方法。不过有一个问题,我想从Foo模型的类方法中解决。目前,我正在这样做:

 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()

这可以正常工作,但老实说有点不客气,尤其是在处理两个以上的子类时。是否有更好,更Pythonic解决此问题的方法?

编辑:我之前没有决定提及我想从bar()模型的类方法中调用Foo方法,因为我认为这个问题是不必要的。但是,Daniel Roseman的答案建议列出一个类列表,这是一个很好的解决方案,但是在类方法中不起作用,因为尚未在模块中定义该类。因此在本次编辑中提到这一点。

1 个答案:

答案 0 :(得分:1)

related_name只是用于从相关类本身执行查询的语法糖。因此,您应该明确地执行此操作:

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