何时使用自定义模型管理器?

时间:2019-12-18 13:07:53

标签: django django-models django-managers

目前,我正在阅读有关自定义管理器的信息,您可以在执行诸如Create之类的CRUD操作时添加其他逻辑。您创建一个自定义管理器类,然后使用该自定义管理器类的实例初始化表类的objects属性。

我还读到您还可以使用pre_save和post_save信号向save操作添加其他保存逻辑。我的问题是:何时应该在信号上使用自定义管理器类,并且比Model类的默认管理器使用自定义管理器慢?

谢谢

1 个答案:

答案 0 :(得分:1)

好的,这是我之前写的。我删去了许多无关紧要的东西,希望所有要点仍然存在。您需要知道有一个外键链PRSBlock-> PRS2-> Jobline-> Description。使用此方法,对PRSBlock.objects.filter(...的所有查询将返回PRSBlock对象,其中包含membrane_tsubstrate_tmaterial的额外字段,这些对象来自遵循以下操作的Description链。在这种情况下,几乎总是需要它们,这与该链中的大多数其他事物不同。 select_related将是严重的过度杀伤力。

class PRSBlock_Manager(models.Manager):   

    def get_queryset(self):
        return super().get_queryset().annotate(
            membrane_t = F('PRS__jobline__description__mt'), 
            substrate_t= F('PRS__jobline__description__ft'),
            material   = F('PRS__jobline__description__material')
        )

class PRSblock( models.Model):

    # override the default manager
    objects=PRSBlock_Manager()  # annotate always with description parametrs relevant to block LUTs

    PRS = models.ForeignKey( PRS2, models.CASCADE, related_name='prs_blocks')
    # and lots of other fields that aren't relevant