如何在Django中创建自定义相关管理器?

时间:2017-04-10 12:31:28

标签: django django-managers

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()

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

如何为ModelA编写这样的经理?

1 个答案:

答案 0 :(得分:2)

这不是管理者的工作,而只是一种普通的模型方法。由于您正在查找与ModelA的特定实例相关的项目,因此您可以在该模型上创建方法。如果您真的想要,可以将其称为modelc_set并将其设为属性:

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