【问题标题】:When to use a custom model manager?何时使用自定义模型管理器?
【发布时间】:2019-12-18 13:07:53
【问题描述】:

现在我正在阅读有关自定义管理器的信息,您可以在执行创建之类的 CRUD 操作时使用这些管理器添加额外的逻辑。您创建一个自定义管理器类,然后使用自定义管理器类的实例初始化表类的objects 属性。

我还了解到,您还可以使用 pre_save 和 post_save 信号向保存操作添加额外的保存逻辑。我的问题是:我什么时候应该在信号上使用自定义管理器类,使用自定义管理器是否比模型类的默认管理器慢?

谢谢

【问题讨论】:

  • 当你(几乎)总是想要过滤/注释/...
  • 过滤/注释是什么意思?
  • 你有一个 Book 和一个 Author 的外键。您定义 Book 管理器,以便所有查询都使用 author_name 注释,这比引用 author.name 更有效。
  • @nigel222 你能给出一个代码示例来说明你想说什么吗?谢谢
  • @FAM_Maurice 好的,看看我的回答

标签: django django-models django-managers


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2023-04-07
    • 2011-04-20
    • 2012-06-04
    • 2013-05-12
    • 2021-07-03
    相关资源
    最近更新 更多