在阅读了Django管理者的文章后,我仍然不确定使用它会给我带来多少好处.似乎最好的用法是添加自定义查询(只读)方法,比如XYZ.objects.findBy*().但我可以很容易地用Model个类中的静态方法来实现这一点.

我更喜欢后者,总是因为:

  1. 代码在可读性和更易于维护方面的局部性
  2. 稍微不那么冗长,因为我的通话中不需要objects属性
  3. Manager个类都有关于模型继承的奇怪规则,最好不要go 管它.

是否有充分的理由使用静态方法,而不是使用管理器类?

推荐答案

向管理器添加自定义查询是Django约定.从custom managers页的Django文档:

添加额外的管理器方法是向模型添加"表级"功能的首选方法.

如果它是您自己的私有应用程序,那么约定这个词并不重要-事实上,我公司的内部代码库有几个类方法,它们可能属于自定义管理器.

但是,如果您编写的应用程序将与其他Django用户共享,那么他们会期望在自定义管理器上看到findBy个.

我不认为你提到的继承问题太糟糕.如果你读了custom managers and model inheritance docs,我想你不会被抓到.编写.objects的冗长是可以忍受的,就像我们使用XYZ.objects.get()XYZ.objects.all()进行查询时一样

在我看来,使用经理方法有几个优点:

  1. API的一致性.你的方法findBy属于get,filter,aggregate和睡觉.想知道您可以对XYZ.objects管理器执行哪些查找吗?当你可以用dir(XYZ.objects)来反省的时候,事情就简单了.

  2. 静电方法使实例命名空间"混乱".XYZ.findBy()可以,但是如果您定义一个静电方法,您也可以做xyz.findBy().在特定实例上运行findBy查找实际上没有意义.

  3. 干涩.有时,您可以在多个型号上使用同一管理器.

说了这么多,就看你了.我不知道为什么不应该使用静态方法.你是成年人,这是你的代码,如果你不想写findBy作为一个管理方法,天空不会塌下来;)

要进一步阅读,我推荐Django发布经理James Bennett的博文Managers versus class methods.

Django相关问答推荐

把Django测试和testcafe结合起来?

DRF中是否有有效的更新有序数据的算法?

django命令中的no_color不起作用

django-filter compose 过滤的 url

django.template.response.ContentNotRenderedError: 必须渲染响应内容才能迭代

无法创建超级用户,因为 Django 中的一列(外键)不能为空

基于模型多选字段在模板django中显示结果

在 PyCharm 中运行 Django 测试

可以在基于 Django 类的视图中设置实例变量吗?

在 Django 中,您可以向查询集添加方法吗?

在 Django 管理屏幕中删除添加另一个

如何验证对象是否存在于多线程中

django 模板 if 或语句

Django 默认=timezone.now + delta

清理提交的表单数据中的 HTML

Django 模型:delete() 未触发

如何在 django 中使用更少的 css?

如何在 Python 中运行另一个脚本而不等待它完成?

如何检测 Heroku 的环境?

Django中'related_name'和'related_query_name'属性之间的区别?