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 官方资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容