目前,我正在阅读有关自定义管理器的信息,您可以在执行诸如Create之类的CRUD操作时添加其他逻辑。您创建一个自定义管理器类,然后使用该自定义管理器类的实例初始化表类的objects
属性。
我还读到您还可以使用pre_save和post_save信号向save操作添加其他保存逻辑。我的问题是:何时应该在信号上使用自定义管理器类,并且比Model类的默认管理器使用自定义管理器慢?
谢谢
答案 0 :(得分:1)
好的,这是我之前写的。我删去了许多无关紧要的东西,希望所有要点仍然存在。您需要知道有一个外键链PRSBlock
-> PRS2
-> Jobline
-> Description
。使用此方法,对PRSBlock.objects.filter(...
的所有查询将返回PRSBlock
对象,其中包含membrane_t
,substrate_t
和material
的额外字段,这些对象来自遵循以下操作的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