让我解释一下。我有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的答案建议列出一个类列表,这是一个很好的解决方案,但是在类方法中不起作用,因为尚未在模块中定义该类。因此在本次编辑中提到这一点。
答案 0 :(得分:1)
related_name只是用于从相关类本身执行查询的语法糖。因此,您应该明确地执行此操作:
child_classes = [ChildOne, ChildTwo]
for child_class in child_classes:
children = child_class.objects.filter(foo=foo)