python - 使用注释代替模型属性

标签 python django django-models django-admin

annotate函数对于为表的每一行定义计算字段非常有用。模型属性也可用于定义计算字段,但受到限制(例如不能用于排序)。

模型属性可以完全被带注释的字段替换吗?什么时候适合分别使用?

最佳答案

注解、属性和其他方法的差异

在某些情况下,注释肯定比属性更好、更容易。这些通常是易于在数据库中进行且逻辑易于阅读的计算。

另一方面,

Django @property 是将计算逻辑写入模型的一种非常简单且 Python 的方式。有些人认为它们很巧妙,另一些人则认为属性应该被烧掉并隐藏起来,因为它们将程序逻辑混合到数据对象中,这增加了复杂性。我认为尤其是@cached_property装饰器相当整洁。

然而,属性和注释并不是在 Django ORM 中查询和计算事物的唯一方法。

在许多复杂的情况下,属性或模型、管理器或查询集方法,尤其是 custom QuerySets and Managers在自定义查询时具有最大的灵 active 。

大多数时候,使用哪种方法在速度上并不重要,并且应该使用最干净或最紧凑的选项,即最简单的编写和最容易阅读。尽量保持简单和愚蠢,这样您需要维护的复杂代码就会最少。

<小时/>

探索、基准测试和优化

在某些情况下,当您遇到性能问题并最终分析 SQL 查询时,您可能被迫使用注释和自定义查询来优化正在执行的查询的复杂性。当您在数据库中进行复杂的查找并且必须在属性中进行计算或创建自定义 SQL 查询时,尤其如此。

如果您有大型查询集,则计算属性中的内容可能会非常复杂,因为您必须在对象很大且迭代速度很慢的 Python 中运行这些计算。另一方面,通过自定义 SQL 查询计算内容可能是维护的一场噩梦,特别是如果您正在维护的 SQL 不是由您编写的。

最终归结为速度要求和计算成本。如果使用普通 Python 进行计算不会降低您的服务速度或花费您的金钱,那么您可能不应该进行优化。如果您要购买一组服务器,那么合理的优化当然可能会为您带来节省,您可以将其用于其他地方。使用 10 个小时来优化某些代码片段可能不会真正获得返回,所以在这里要非常小心。

在优化案例中,如果您不是先知并且本能地知道问题是什么,则必须权衡不同的优点和缺点并尝试不同的解决方案。如果问题很明显,它可能会更早被优化掉,对吗?

当尝试不同的选项时 Django Debug Toolbar , SQL EXPLAINANALYZEPython profiling是你的 friend 。

请记住,许多查询问题也是与数据库相关的问题,并且糟糕的数据库设计或维护可能会损害性能。记得运行VACUUM定期并尝试 normalize your database design .

Toolwise Django 调试工具栏特别有用,因为它可以帮助进行性能分析和 SQL 分析。许多 IDE(例如 PyCharm)甚至还可以在正在运行的服务器上提供分析功能。如果您想要进行开发设置并将不同的工具集成到其中,这非常有用。

关于python - 使用注释代替模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47875472/

相关文章:

python - 如果 focus = False,有没有办法让 TextInput 实例执行 on_text_validate ?

python - Pandas pd.read_csv 不适用于大于 900MB 的 csv 文件

python - 是否可以从 Django 管理页面禁用缓存?

Django - Timeuntil标签输出缩写

python - Django ImageField.path 在 save 方法中返回没有 upload_to 的路径

python - 为什么这个 python 正则表达式不能编译?

python - 在通配符/模式上解析 Python 中的文本文档行

Django密码问题

python - Django .save() 不可预测地处理 update_fields 输入

django - 初始化模型字段,包括 manytomanyfields