Django是一个强大的web框架,但是它的强大也带来了责任。在本文中,我们将讨论即使是经验丰富的Django开发人员也会犯的常见错误,但是大多数成功的Django项目迟早都需要处理这些错误。

重新发明轮子

Django有很多现成的特性,甚至还有更多的第三方包。试着在写代码之前“google”一下您想解决的问题——可能已经有一个功能丰富的解决方案了。

您还可以使用在线目录“Django项目”,其中“apps”类别中(用于构建项目的小组件)有超过3200个项目。以下是来自清单前两页的有趣包的简短示例:

  • Haystack:用于Django的模块搜索

  • Django-taggit:用于Django的简单标记

  • Django-guardian:用于Django的每个对象的权限

  • Django-activity-stream:从站点上的操作生成通用的活动流。用户可以跟踪任何参与者的个性化流的活动。

额外提示:我强烈推荐使用cookiecutter-django启动一个新的Django项目。它有一个自定义的用户模型,通过django-allauth进行注册,通过Anymail发送电子邮件,以及许多与安全和部署相关的默认设置。

庞大的应用程序结构

Django是一个松散耦合的框架,它不要求您以任何特定的方式来构建web应用程序。然而,经验丰富的Django开发人员有一种标准的做事方式。

Django web应用程序的基本单元是由一个或多个app组成的Django项目。Django app是一个自包含的包,它应该只做一件事。例如一个博客、会员app或事件日历。

Django app可以包含Python模块、特定于Django的模块(视图、URL、模型、表单等)、静态文件、数据库迁移、管理命令、单元测试等等。您应该使用简单的逻辑将您的项目划分为小型的、可重用的应用程序。

使用这样的结构,相关的功能将更紧密地结合在一起,从而允许您和您的团队更清楚地看到您的应用程序的全貌。最重要的是,您可以将该应用程序导出到另一个项目中并再次使用它,甚至可以将它作为一个开源模块发布在PyPi上。

编写健壮的视图和骨感的模型

Django的体系结构可以描述为一个模型-模板-视图(MTV)或模型-视图-模板(MVT)。

模型是大多数业务逻辑存在的地方。它被定义在models.py中,并存在于应用程序目录中。它还包括将结果传递给视图和模板层的数据库查询。

视图由处理用户交互的代码组成,如处理用户提交的表单和修改数据库中的结果以适应您的模板。它被定义在views.py中。

如果您没有在模型中编写应用程序的逻辑并使用视图,这意味着您在基于视图的模型中编写了代码。这使得视图“健壮”,而模型“骨感”。模型应该健壮一些,而视图应该骨感一些。

您还应该利用自定义管理器。例如,自定义管理器可以提供with_counts()方法,该方法会返回一个所有OpinionPoll对象的列表,每个对象都有一个额外的num_responses属性,该属性是聚合查询的结果。有关更多信息,请查看内置的UserManager。

每个视图有太多的查询或未优化的查询

人们经常指责Django的ORM执行了太多的查询或未优化的查询。但是我们在其他框架的ORM中也能看到这种情况。

真正的问题是我们常常没有意识到性能问题及其根源。一旦您发现了瓶颈所在,您就可以选择正确的方法来解决它们。从这里你可以做很多事情,但最有可能的是:

  • 修复普通中断的ORM查询(比如,预取)

  • 调整和优化ORM查询

  • 在正确的位置添加缓存

  • 提供更多的资源

django-debug-toolbar是一个非常棒的调试工具。您可以使用它来跟踪SQL查询、请求、模板、缓存等等中的性能问题。这个小工具包将帮助您快速识别问题。我强烈推荐您使用它。

冗余的模型字段

由于查询不能使用计算列,而且添加一个实际的列只需“进行迁移”,因此,开发人员通常会以不同的方式复制表示相同数据的字段。

>>> 今日签到口令:1bof <<<

很快,您的半数车辆都有is_motorcycle == True和wheel_count == 4字段,并且您不确定应该信任哪个字段(提示:两者都不是)。

使用Django,您可以像这样使用@property装饰器来重构不一致的属性。然而,虽然ORM允许您以属性的形式去访问列,但反之则不正确,因此您必须手动重构每个查询。

没有在模型上添加索引

即使是经验丰富的Django开发人员也会忘记索引。请务必向您的模型添加索引!另一方面,不要对所有东西都进行索引,因为这会减慢插入、更新和删除的速度。一般来说,您希望用于筛选或查询的任何内容都有一个索引。分析您的查询集以确定哪里需要索引。

不一致的数据验证

Django模型可以与一个或多个用于创建和更新模型实例的“表单”相关联。表单有很多默认行为,特别是验证,这是由模型的属性控制的。实际上,模型的许多属性的存在只是为了控制表单的默认行为。

许多Django开发人员忘记了模型不仅仅可以通过它的表单进行修改。他们也忘记了跟踪约束在哪里。非空吗?那是模型上的。在一个字段上定义选项,显式枚举它可以具有什么值?那是在表单上。唯一性吗?在模型上。等等。

这种不一致的验证会导致糟糕的用户体验:预先填充了一个对象的现有数据的表单,会由于现有数据无效而无法提交。

总结

Django旨在帮助开发人员尽可能快地构建软件。然而,在匆忙添加新功能时,很容易会忘记一些东西或放松对全局的考虑。在本文中,我们讨论了Django开发人员经常犯的一些常见错误以及避免这些错误的方法。

即使您是一名熟练的Django开发人员,这个清单也应该会很有用,因为像没有在模型上添加索引或不一致的数据验证之类的错误,不仅仅限于新开发人员。

如果您喜欢这篇文章,那么您应该看看《Django作为Python开发人员web框架的优点和缺点》一文。

英文原文:https://www.softkraft.co/7-common-mistakes-that-django-developers-make/ 
译者:忧郁的红秋裤

django models索引_Django开发者常犯的7种错误相关推荐

  1. 《经理人常犯的11种错误》观后感

    这几天又看了余世维先生几年前的录制的<经理人常犯的11种错误>,感触良多,兹为笔记. 余先生的眼光高远,看问题视角独到,往往从小处入手,令人耳目一新. 现在我们还是强调去国际接轨,我们一些 ...

  2. django models索引_Django(生命周期、每部分详解、路由层)

    https://www.zhihu.com/video/1248736141978927104 每日测验 """ 今日考题 1.什么是静态文件,django静态文件配置如 ...

  3. 用了mysql报oracle错误_Oracle认证:PHP开发者常犯的MySQL错误

    [IT168技术]为了方便广大考生更好的复习,综合整理提供了Oracle认证:PHP开发者常犯的MySQL错误,以供各位考生考试复习参考,希望对考生复习有所帮助. PHP开发者常犯的10个MySQL错 ...

  4. Java程序员最常犯的 10 个错误

    转载自 Java程序员最常犯的 10 个错误 这个列表总结了Java开发人员经常犯的10个错误. 一 .把数组转成ArrayList 为了将数组转换为ArrayList,开发者经常会这样做: List ...

  5. Tomcat 下构建 Web 应用时,常犯的一些通用错误

    Tomcat 下构建 Web 应用时,常犯的一些通用错误 这些错误可以引发的问题 常犯的通用错误 笔者报错时的运行环境: JDK 13.0.2 Maven 3.6.3 Tomcat 9.0.41(Se ...

  6. 中国父母常犯的十大错误(转载)

    中国父母常犯的十大错误,如何对待孩子,如何教育孩子,值得深思............. (一)让保姆爷爷奶奶带孩子.不自己亲自照顾 很多中国父母以为孩子只要身边有人看著,没有生命危险就好.其实从出生开 ...

  7. 《职业经理人常犯的11个错误》——余世维

    相比<赢在执行力>,余博士<职业经理人常犯的11个错误>所谈到的问题更为尖锐,每个问题都一针见血地挑出作为一个处于工作中的人(不仅仅是职业经理)习惯性所容易犯的错误. 第一个错 ...

  8. 域名该怎样选_给项目选择域名时我们常犯的几个错误 我们应该如何正确选择域名...

    互联网创业,域名先行.业界传说这句话是由京东掌门人刘强东总结出来的,其实在我看来,不管刘总是不是说了这句话,这句话目前都俨然已经成为了大家在做互联网项目的时候的金科玉律.换句话说,一个互联网项目的组成 ...

  9. 微博运营与微博营销最易犯的20种错误,你犯了吗?

    微博估计是自搜索引擎以来迅速被企业应用最广泛的网络营销工具.而且还免费.但做了不意味着有效.在企业微博运营与微博营销过程中,你或许正在犯着这样那样的错误,本文以新浪微博为例,汇总微博运营与微博营销最易 ...

最新文章

  1. admin及admin888 经过 md5加密后16位和32位代码
  2. 使用DBUtils编写通用的DAO
  3. asp编程工具_使用ASP.NET Core构建RESTful API的技术指南
  4. java gui 控制台_在GUI面板中创建Java控制台
  5. SqlMapConfig.xml配置文件---Mybatis学习笔记(七)
  6. 漫画:什么是八皇后问题
  7. Pollar Rho算法
  8. jenkins用ssh agent插件在pipeline里实现scp和远程执行命令
  9. 单片机定时器_单片机定时器/计数器基本原理
  10. server2012 AD域 radius 802.1x认证
  11. 最专注和高效的查词法?网易有道词典笔2.0评测
  12. 凸优化第六章逼近与拟合 6.4鲁棒逼近
  13. 解除谷歌浏览器默认禁止音频自动播放
  14. npm run dev命令报错解决方式
  15. 理论上 Android可以处理 多个手指的触摸
  16. 水处理离子交换设备详解
  17. 计算机文字录入培训大纲,计算机文字录入处理员教学大纲.doc
  18. 全文搜索 full-text search
  19. 下拉框滑动穿透页面-曲线救国
  20. 响应式网站设计(1)-理论

热门文章

  1. Python中最重要的知识点:切片的操作,学习python一定要会的操作!
  2. Python运算符可不只有加减乘除
  3. python多线程用法及与单线程耗时比较
  4. linux搭建directx环境,微軟開始在WSL 2環境中的Linux支援DirectX
  5. java多线程notify_Java多线程 wait notify
  6. Linux编译安装中configure、make和make install各自的作用详解
  7. 【深度学习的数学】用神经网络进行图像分类时,为什么输出层的神经单元数量要跟分类数相同?可以采用二进制的表示方式么?
  8. 【中级软考】PV操作是什么?(passeren【通过、申请资源、减量】、vrijgeven【释放、释放资源、增量】【荷兰文】)(用于进程间同步)
  9. 平移不变性:Translation Invariance 与 平移同变性:Translation equivariance
  10. PyQt5初级——2