你见过的最糟糕的Django练习

时间:2010-01-13 16:50:31

标签: python django

你注意到使用Django框架的最大错误是什么?您是否看到过一些真正的误用,可能应该作为Django文档的警告?

10 个答案:

答案 0 :(得分:27)

视图中的逻辑过多。

我曾经写过难以适应40行的观点。现在我考虑超过2-3个缩进级别,10个左右的LOC或一些内联注释,以便代码闻起来。

诱惑是编写最小模型,找出您的网址路由,然后在视图中执行其他操作。实际上,您应该使用模型方法,管理器,模板标签,上下文处理器,基于类的视图和抽象基本视图......保持视图代码简单易读的任何东西。保存表单的逻辑应该在Form.save()中。在多个视图的开头或结尾重复的逻辑应该放在装饰器中。重用的显示逻辑应该放在include d模板,模板标签和过滤器中。

长视图难以阅读,理解和调试。学习如何使用工具包中的其他工具,您将为自己和团队节省很多痛苦。

答案 1 :(得分:12)

不将内容分成多个应用程序。它不是关于可重用性,而是关于拥有十几个模型,并且在一个应用程序中有超过100个视图,它是不可读的。另外,我希望能够轻松扫描我的urls.py文件以查看URL指向的位置,当我有100个更难的网址时。

答案 2 :(得分:11)

我尝试将项目附加到会话中而不将其复制出来,附加项目,然后将列表添加回会话。

这个错误出现在NewbieMistakes页面上,所以希望我能够很好地合作。

这是正确的方式,以防万一有人好奇。

sessionlist = request.session['my_list']
sessionlist.append(new_object)
request.session['my_list'] = sessionlist

答案 3 :(得分:9)

我认为最大的问题是人们尝试编写好像是Java / C的代码:他们尝试创建过于通用的应用程序,这些应用程序在未来需求发生变化时永远不需要更改(这对于Java / C来说是必需的,因为这些应用程序不是改变/重新设计非常容易。结果是一个非常复杂的应用程序,它不灵活且无法维护。

在Django中没有必要:只需编写今天的要求,使用已定义的特定任务构建可重用的应用程序,并在需要时进行更改。我越来越多地发现自己试图尽可能简单地编写内容,不惜一切代价避免过于复杂的设计。

答案 4 :(得分:5)

  1. 使用预保存和保存后事件进行调整。

    如果你不能简单地在save中这样做,你应该重新考虑你想要做的事情。毕竟,它只是一个关系数据库。如果您正在做的事情变得太复杂,那么您将遇到ORM映射问题。

  2. 尝试编写uber-generic - 一个视图可以完成所有功能。视图函数是函数的原因。他们可以使用模块,包,对象,其他功能等。它们可以很短且类似,而不会产生代码味道。

    如果你需要使用10行代码来构造uber-generic-do-it-all对象,它将是一个没有uber-generic-do-it-all对象的12行视图函数,那么超级客体没有帮助。

  3. 在ORM模型类上强加了太多超级复杂的对象类设计。如果它需要抽象基类或元类,则在ORM层中表现不佳。

  4. 未能使用tests.py和测试客户端创建完整的单元测试,无论其声明应用程序是什么。

答案 5 :(得分:5)

最糟糕的facepalm时刻......返回一个无限的查询,恰好是几十万行。它是在一个很少使用的代码中,因此不经常发生,但是当它发生时它会导致服务器崩溃。

始终确保您的查询结果有限,即:

results = MyModel.query.all()[:100]

results = MyModel.query.all()

或使用迭代器:

for result in MyModel.query.iterator():

答案 6 :(得分:5)

不使用raw_id字段作为10000+对象的密钥,然后想知道为什么访问Admin会使服务器瘫痪

答案 7 :(得分:4)

我遇到过最糟糕的做法:使用默认id作为模型主键的其他内容。

这看起来不错,但它在管理网站上引起了一些问题,并且很难将id恢复为现有数据库的主键。

我认为没有特定的案例足以导致这些问题。我建议默认保留模型的ID。

有关详细信息,请参阅What is the best approach to change primary keys in an existing Django app?

答案 8 :(得分:3)

我最大的错误是使用<project_name>.<app_name>.models而不是<app_name>.models等绝对导入。这样,当我创建一个分支并想在不同的目录中检查它(比如拥有和我的项目的-stable)时,它就不会运行。我设法在一个项目中恢复并在一个项目中仅使用相对导入,但在另一个项目中,我们必须坚持使用它(我们有绝对和相对)。我不会再犯这个错误。

答案 9 :(得分:0)

我首先错误地开始编写python代码而不阅读PEP。 我引用的最糟糕的事情是

注意:我在这里引用的内容是 DONT'S

1

foo       =  bar

foobar    =  bar

foobarbuz =  bar

2

foo = "foo"
bar = "bar"
foobar = foo + bar //string concat

3

foo = [1,2,3,4,5,6]
foo_ = []
for bar in foo:
  foo_.append(bar)

4

编写项目名称为

的import语句
from projectname.appname.models import model

5

尝试使用普通python函数的视图

更新:或者在视图中有太多的逻辑而不是将某些内容移动到帮助器(utils),我在这里指的是进行重定向的不良做法,有人在视图中编写辅助函数。

6

没有docstring并使用命名空间的函数/方法无法连接到上下文。