当前位置: 首页 > 面试题库 >

直接在Model类上使用Django Managers和staticmethod

蒯硕
2023-03-14
问题内容

在阅读了Django
Managers之后,我仍然不确定使用它会带来多少好处。似乎最好的用法是添加自定义查询(只读)方法,例如XYZ.objects.findBy*()。但是我可以使用Model类本身之外的静态方法轻松地做到这一点。

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

  1. 从可读性和易于维护的角度讲代码的局部性
  2. 由于我objects在通话中不需要该属性,因此略微冗长
  3. Manager 类具有关于模型继承的怪异规则,最好不要这样做。

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


问题答案:

将自定义查询添加到管理器是Django约定。来自自定义管理器的Django文档:

添加额外的Manager方法是向模型添加“表级”功能的首选方法。

如果是您自己的私人应用程序,那么约定用词并不重要-实际上,我公司的内部代码库具有一些可能属于自定义管理器的类方法。

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

我认为您提到的继承问题不是太糟糕。如果您阅读了自定义管理器和模型继承文档,我认为您不会陷入困境。写作的冗长性.objects是可以忍受的,就像我们使用XYZ.objects.get()和进行查询时一样XYZ.objects.all()

我认为使用管理器方法有以下几个优点:

  1. API的一致性。你的方法findBy属于有getfilteraggregate和休息。想知道您可以在XYZ.objects管理器上执行哪些查询吗?您可以内省时很简单dir(XYZ.objects)

  2. 静态方法使实例名称空间“混乱”。XYZ.findBy()很好,但是如果您定义静态方法,也可以这样做xyz.findBy()findBy在特定实例上运行查找实际上没有任何意义。

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

说了这么多,这取决于您。我不知道为什么不应该使用静态方法的致命原因。您是成年人,这是您的代码,如果您不想以findBy管理者的方式编写代码,那么天空不会掉下来;)

为了进一步阅读,我推荐Django发布经理James
Bennett的博客文章Managers与类方法。



 类似资料:
  • 会在 iOS 上出现 v-model 在 textarea 上不生效的问题,原因是在 iOS 真机上,无法动态在 textarea 设置 data-,即: <textarea data-cid="{{cid}}" bindinput="onInput"></textarea> 当 input 事件触发时,无法从事件对象上取得 dataCid 的值,从而无法根据上面的信息找到对于的事件处理方法。

  • 在使用Model从json获取数据并将数据显示到我的应用程序中时,我有点困惑。 我有这种json数据: } 我正在尝试这种代码: 我正在使用“AFNetworking”,我正在尝试获取数据并存储到模型类中,然后显示到自定义单元格标签。 我怎样才能得到它。 谢谢你。

  • **大佬们都采用的是CSS Model方案吗?或者在pages/_app.js 引入一堆? 感觉应该是支持向create- react-app引入sass的,我再找找资料看看,感觉是少了配置** 大佬们最近刚由 create- react-app 转 NnextJS。觉得用css CSS Mmodel 每次都加一个 ${style.XXX} 太麻烦了,之前用的 .parentclass { .cl

  • 基类既可能是派生类的直接基类,也可能是派生类的间接基类。在声明派生类时,派生类的首部要显式地列出直接基类。间接基类不是显式地列在派生类的首部,而是沿着类的多个层次向上继承。

  • HTML 原生的输入元素类型并不总能满足需求。幸好,Vue 的组件系统允许你创建具有完全自定义行为且可复用的输入组件。这些输入组件甚至可以和v-model一起使用!要了解更多,请参阅组件指南中的自定义输入组件。

  • 我有一个应用程序,它跨各种片段和活动接受大量用户输入。现在,我将所有变量都放在一个类中,我们将其称为“Report”,并传递主键,以确切了解我所处的“Report”是什么。(开始时有一个ListView,用户可以在其中选择要更改的报表)因为所有用户输入最终都必须写入数据库我有一个想法-为什么不从报表中删除所有变量,并用静态最终列名替换它们,只留下主键变量,然后使用getter和setter直接读取