【备忘】Django 常用命令及最佳实践

注意:本文基于 Django 1.8.2 版本

 

生成数据库迁移脚本(python 脚本)

python manage.py makemigrations polls

 说明:polls 是你的应用名字,运行该命令时需要根据你的应用名字进行调整

 

查看该次迁移需要执行的 SQL 语句(只查看语句,并不应用到数据库上):

python manage.py sqlmigrate polls 0001  

说明:polls 是你的应用名字,0001是数据库迁移脚本的序号,运行该命令时需要根据你的应用名字及数据库迁移脚本的序号进行调整

 

进行数据库迁移:

python manage.py migrate

说明:该命令会执行真正的数据库迁移,即执行上一个命令中的  SQL语句,以实现 Model 变更跟数据库的同步。

 

 

最佳实践:

  • 对于要赋值当前时间给字段类型为DateTimeField的字段时,用 timezone.now() 代替 datetime.datetime.now() (注意:需要导入 from django.utils import timezone)
  • 可以在model 对象上自定义__str__(Python3)或__unicode__(Python 2)方法,让直接输出model 时,更有意义,例如:
    def __str__(self):              # __unicode__ on Python 2
            return self.choice_text
  • 将每个 APP 自己的 URL 映射关系,放到 app 自己的目录下面的 urls.py 文件中(改文件需要自己创建),然后在项目的 urls.py 中将其 include 进来,而不要将所有的 URL 都写在项目的 urls.py 下面,更好的做法如下所示(下面例子中的 app 名称为 polls 和 admin):
    .....
    urlpatterns = [
        url(r'^polls/', include('polls.urls', namespace="polls")),
        url(r'^admin/', include(admin.site.urls)),
    ]
    .....
     
  • 当一个项目下面的 app 个数多过3个时,可以对项目目录的 urls.py 文件中通过 include 加入的 urls 增加namespace 属性,给APP 中的 urls.py 中的 url 增加name 属性来防止命名冲突,并且可以获得更好的灵活性,如下面的例子所示:
         项目目录下的 urls.py 内容为:
.....
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^polls/', include('polls.urls', namespace="polls")),
]
  其中为 polls 的 app 增加了命名空间: namespace="polls"
  在 app 中的 urls.py 的内容为:
....
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    ......
]
  其中为首页和明细页面各自都添加了 name 属性。
 在页面中的用法如下: 
.....
<a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a>
....
 
         注意到里面的命名方式了吗? polls:detail
  • 在你成功处理了 POST 提交上来的数据后之后,应该总是返回 HttpResponseRedirect 对象,如下所示:
    from django.http import HttpResponseRedirect
    
    ....
    def dealwith_post_data(request, args):
       ........
       return HttpResponseRedirect(...)
    ....
     

你可能感兴趣的:(django)