让我解释。我有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
方法,因为我认为这个问题没有必要。但是,Daneil Roseman的回答建议制作一个类列表,这是一个很好的解决方案,但它在类方法中不起作用,因为类中尚未定义类。所以在这个编辑中提到。
related_name只是用于从相关类本身执行查询的语法糖。所以你应该明确地这样做:
child_classes = [ChildOne, ChildTwo]
for child_class in child_classes:
children = child_class.objects.filter(foo=foo)