我有抽象模型:
class CModel(CParent):
class Meta:
abstract = True
并且有两个基于这个抽象模型的模型:
class Model1(CModel):
pass
class Model1_A(models.Model):
model = models.ForeignKey(Model1, related_name="a")
class Model1_A_B(models.Model):
model = models.ForeignKey(Model1_A, related_name="b")
第二:
class Model2(CModel):
def all_obj(self):
...
list = Model2_A_B.objects.filter(model__model__pk=self.pk).all()
...
class Model2_A(models.Model):
model = models.ForeignKey(Model2, related_name="a")
class Model2_A_B(models.Model):
model = models.ForeignKey(Model2_A, related_name="b")
现在我想将函数 all_obj() 移动到抽象类,所以它也可以在 Model1 中使用,但是对于 Model1 我需要这样的东西:
list = Model1_A_B.objects.filter(model__model__pk=self.pk).all()
如何使 all_obj() 适用于任何型号名称?
我想出了这样的事情:
list = eval(self.a.all()[:1][0].b.all()[:1][0].__class__.__name__).objects.filter(model__model__pk=self.pk)
但我认为这不是正确的做法。并且存在问题,仅当 self.a.all()[:1][0] 具有相关对象时才有效,但这并不总是正确的。