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

问题描述 投票:0回答:1

让我解释。我有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()对象相关的ChildOneChildTwo模型中所有对象的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方法,因为我认为这个问题没有必要。但是,Daneil Roseman的回答建议制作一个类列表,这是一个很好的解决方案,但它在类方法中不起作用,因为类中尚未定义类。所以在这个编辑中提到。

django django-models django-orm
1个回答
1
投票

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

child_classes = [ChildOne, ChildTwo]
for child_class in child_classes:
    children = child_class.objects.filter(foo=foo)
© www.soinside.com 2019 - 2024. All rights reserved.