美文网首页
Django 学习笔记(1)

Django 学习笔记(1)

作者: 钟大發 | 来源:发表于2017-02-24 13:48 被阅读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 官方资料

    相关文章

      网友评论

          本文标题:Django 学习笔记(1)

          本文链接:https://www.haomeiwen.com/subject/igxwwttx.html