2017-04-10 56 views
0
class ModelA(Model): 
    pass 

class ModelB(Model): 
    modela = ForeignKey(ModelA, on_delete=CASCADE) 

class ModelC(Model): 
    modelb = ForeignKey(ModelB, on_delete_CASCADE) 

在这种情况下,Django会自动为我们创建一些额外的管理器。例如,如果maModelA的实例,那么我们可以编写:ma.modelb_set.all(),并且如果mbModelB的实例,那么我们可以编写:mb.modelc_set.all()如何在Django中创建一个自定义的相关管理器?

能够引用与ModelA相关的所有ModelC实例会很方便。当然,如果maModelA的一个实例,我们总是可以写出:ModelC.objects.filter(modelb__modela=ma).distinct()。然而,它会更方便,如果我们可以定义为ModelA经理,使我们通过简单地写,执行上面的查询:ma.modelc_set.all()

如何写这样的经理ModelA

回答

2

这不是经理的工作,而只是一种正常的模型方法。既然您正在查找与ModelA的特定实例相关的项目,则可以在该模型上创建一个方法。如果你真的想要,你可以把它叫做modelc_set并使之成为一个属性:

@property 
def modelc_set(self): 
    return ModelC.objects.filter(modelb__modela=self).distinct() 
+0

好的,谢谢你的回答。然而,在这种情况下,为什么Django的默认管理器用于反转一对多关系管理器而不是属性? – gaazkam

+1

你不能用属性做的一件事:'prefetch_related('modelc_set')' – gaazkam

相关问题