Django 学习笔记(1)
背景
Django 是个很有意思的东西,和传统的mvc(model,views,controller)不一样,用的是一种mtv的框架,即models,templates,views 第一次听说还是当时的老大介绍的。当时有点懵逼,回去做了一下才发现mtv框架的好处,在我看来最大的好处就是各个webapp之间的耦合关系,一个程序员只要负责对应的app 即可,且不会影响到其他的部分。
安装
apt-get install python-pip
pip install -v django==1.7.1#指定django 的版本。
django-admin.py startproject blog #创建项目
python manage.py startapp article #创建APP
注册对应的APP到setting 文件:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
) #django 自带了好多有意思的插件,当有新的插件需要使用时,也需要注册
最基础的目录类型:
└── blog
├── article
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── blog
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
└── manage.py
models
看名字就知道干嘛的,models 用于主要处理数据,django 对数据库的支持也很到位,sqlite3, MySQL, PostgreSQL等数据库都有支持。如果只是学习的话就用自带的sqlite3 就可以了,因为比较熟悉mysql ,就选用mysql 作为学习用的数据库了。
django 连接mysql 需要python-mysqldb 的包,pip 安装或者apt安装都可以:
apt-get install python-mysqldb
修改setting.py,删除原来的databases 配置,修改如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DB_WEB',
'USER': 'ops',
'PASSWORD': 'ops',
'HOST': '127.0.0.1',
'PORT': '3306',
'DEFAULT_CHARSET':'utf-8'
}
}
mysql 建库的时候要注意,mysql 坑就坑在编码问题上,所以建库的时候要带character 不然之后还要导出恢复再改编码,有的折腾了。
CREATE DATABASE DB_WEB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
然后就需要设计对应的app的数据库模型了,django 操作数据库并不是使用常用的sql语句的,使用的是对应的api,同样,创建数据库也并不用sql语句创建,直接写在models 里就可以了,假设我们要做个简单的blog ,需要做个文章展示页,那就根据这个创建数据库模型吧,编辑article下的models.py:
from django.db import models
# 每一个 Django Model 都继承自 django.db.models.Model
from django.db import models
# Create your models here.
class Article(models.Model):
ar_title = models.CharField(max_length=50)
ar_time = models.DateTimeField(auto_now_add=True)
ar_tag = models.CharField(max_length=30)
ar_content = models.TextField()
ar_click = models.IntegerField(default=0)
def __unicode__(self):
return self.ar_title
关于字段中的field类型还有很多,收藏了一篇写的很细致的blog:
http://www.cnblogs.com/ccorz/p/5845711.html
之后在项目的根目录下同步一下models 到数据库:
python manage makemigrations
python manage migrate
同步之后可以登录mysql 看到对应的表:
mysql> desc blog_article;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| ar_title | varchar(50) | NO | | NULL | |
| ar_time | datetime | NO | | NULL | |
| ar_tag | varchar(30) | NO | | NULL | |
| ar_content | longtext | NO | | NULL | |
| ar_click | int(11) | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
之前说了django 操作数据库用的不是sql语句而是api的方式调用,这个列举一下几个常用的操作:
#插入数据的操作
Article.objects.create(title = 'Hello World', category = 'Python', content = '123')
#查询数据操作
Article.objects.all() #查看全部对象, 返回一个列表, 无对象返回空list
Article.objects.get(id = 1) #返回符合条件的对象
Article.objects.filter(category = python).count() #统计python 标签的数据的数量
#更新数据操作
first = Article.objects.get(id = 1) #获取id = 1的对象
注:
get只返回一个记录,filter返回一个是一个列表,而且如果没有找到记录的话,get会raise一个异常,filter只是返回一个空列表。
然后说了那么多,我并不喜欢用django自带的api调用方式,习惯了使用mysqldb模块来操作数据库,所以这里也就随便提一下= = 。
由于不准备使用django的DB api 来操作数据库,而选用mysqldb模块来操作,于是干脆在项目下面建立个lib 目录用于存放连接数据库的模块。
# tree
.
├── db_conn.py
├── __init__.py
init是空文件,表示该目录为一个python库
db_conn.py:
#! /usr/bin/python
#-*- coding: utf-8 -*-
import MySQLdb
import ConfigParser
import os
import logging
def DB_Conn():
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s [%(levelname)s] %(message)s',
filename=os.path.abspath(os.path.join(os.path.dirname(__file__),"..")) + '/log/net_connect.log',
)
#config read
config = ConfigParser.ConfigParser()
config.read(os.path.abspath(os.path.join(os.path.dirname(__file__),"..")) + '/conf/db.conf')
db_ip = config.get("db_connect","ip")
db_port = config.get("db_connect","port")
db_passwd = config.get("db_connect","password")
db_name = config.get("db_connect","dbname")
db_user = config.get("db_connect","dbuser")
try:
dbconn = MySQLdb.Connection(host=db_ip,user=db_user,passwd=db_passwd,db=db_name,port=int(db_port),charset="utf8")
dbcursor = dbconn.cursor()
return (dbconn,dbcursor)
except Exception,e:
logging.error("Connect DB Failed! -- " + str(e) )
之后在对应的views 里引用该库就能操作数据库了。
然后在admin 里注册该models就可以了。
admin.py:
from django.contrib import admin
from blog.models import Article
# Register your models here.
admin.site.register(Article)
参考资料:
https://docs.djangoproject.com/en/dev/ref/models/querysets/ #queryset 的API 官方资料