Django 学习笔记(1)

2017-02-24  本文已影响0人  钟大發

背景

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

上一篇下一篇

猜你喜欢

热点阅读