Django: 之数据库完美解析
Python的web矿建有Django、Tornado、Flask等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定,模版引擎、缓存、Session等诸多功能。
基本配置
一、创建django程序
终端命令:django-admin startproject sitename
IDE创建Django程序时,本质都是自动执行上述命令
其他常用命令:
python manage.py runserver 0.0.0.0 #运行Django,默认是127.0.0.1,如果在不同服务器上访问后面直接加本机IP
python manage.py startapp appname #创建app,后面直接跟创建的app名称
python manage.py syncdb #安装数据库
python manage.py makemigrations #
python manage.py migrate
python manage.py createsuperuser
二、程序目录
三、配置文件
安装数据库
- E:\python\\html\mysite>python manage.py syncdb
- Creating tables ...
- Creating table django_admin_log
- Creating table auth_permission
- Creating table auth_group_permissions
- Creating table auth_group
- Creating table auth_user_groups
- Creating table auth_user_user_permissions
- Creating table auth_user
- Creating table django_content_type
- Creating table django_session
- You just installed Django's auth system, which means you don't have any superusers defined.
- Would you like to create one now? (yes/no): yes
- Username (leave blank to use 'administrator'): root #数据库名称
- Email address:
- Password: #数据库密码
- Password (again):
- Superuser created successfully.
- Installing custom SQL ...
- Installing indexes ...
- Installed object(s) from fixture(s)
1、数据库
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
- 'USER': 'root',
- 'PASSWORD': '123456',
- 'HOST': '',
- 'PORT': '',
- }
- }
2、模版
- TEMPLATE_DIRS = (
- os.path.join(BASE_DIR, 'templates'),
- )
3、静态文件
- STATICFILES_DIRS = (
- os.path.join(BASE_DIR,'static'),
- )
路由系统
1、每个路由规则对应一个view中的函数
- url(r'^index/(\d*)', views.index),
- url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),
- url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),
2、根据app对路由规则进行一次分类
- url(r'^web/',include('web.urls')),
django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的web框架则是对一类的url请求做一条路由映射,从而使路由变得简介。
通过反射机制,为django开发一套动态的路由系统Demo:点击下载
模版
1、模版的执行
模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将Model中获取的数据插入到模版中,最后将信息返回给用户。
- def current_datetime(request):
- now = datetime.datetime.now()
- html = "<html><body>It is now %s.</body></html>" % now
- return HttpResponse(html)
- from django import template
- t = template.Template('My name is {{ name }}.')
- c = template.Context({'name': 'Adrian'})
- print t.render(c)
- import datetime
- from django import template
- import DjangoDemo.settings
- now = datetime.datetime.now()
- fp = open(settings.BASE_DIR+'/templates/Home/Index.html')
- t = template.Template(fp.read())
- fp.close()
- html = t.render(template.Context({'current_date': now}))
- return HttpResponse(html
- from django.template.loader import get_template
- from django.template import Context
- from django.http import HttpResponse
- import datetime
- def current_datetime(request):
- now = datetime.datetime.now()
- t = get_template('current_datetime.html')
- html = t.render(Context({'current_date': now}))
- return HttpResponse(html)
- return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))
2、模版语言
模版中也有自己的语言,该语言可以实现数据展示
- {{ item }}
- {% for item in item_list %} <a>{{ item }}</a> {% endfor %}
forloop.counter
forloop.first
forloop.last
- {% if ordered_warranty %} {% else %} {% endif %}
- 母板:{% block title %}{% endblock %}
子板:{% extends "base.html"%}
{% block title %}{% endblock %}
- 帮助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}
3、自定义simple_tag
a、在app中创建templatetags模块
b、创建任意.py文件,如:xx.py
- #!/usr/bin/env python
- #coding:utf-
- from django import template
- from django.utils.safestring import mark_safe
- from django.template.base import resolve_variable, Node, TemplateSyntaxError
- register = template.Library()
- @register.simple_tag
- def my_simple_time(v1,v2,v3):
- return v1 + v2 + v3
- @register.simple_tag
- def my_input(id,arg):
- result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
- return mark_safe(result)
c、在使用自定义simple_tag的html文件中导入之前创建的xx.py文件名
- {% load xx %}
d、使用simple_tag
- {% my_simple_time 1 2 3%}
- {% my_input 'id_username' 'hide'%}
e、在settings中配置当前app,不然django无法找到自定义的simple_tag
- INSTALLED_APPS = (
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'app01',
- )
Form
django中的Form一般有两种功能:
- 输入html
- 验证用户输入
- #!/usr/bin/env python
- # -*- coding:utf- -*-
- import re
- from django import forms
- from django.core.exceptions import ValidationError
- def mobile_validate(value):
- mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
- if not mobile_re.match(value):
- raise ValidationError('手机号码格式错误')
- class PublishForm(forms.Form):
- user_type_choice = (
- (, u'普通用户'),
- (, u'高级用户'),
- )
- user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,
- attrs={'class': "form-control"}))
- title = forms.CharField(max_length=,
- min_length=,
- error_messages={'required': u'标题不能为空',
- 'min_length': u'标题最少为5个字符',
- 'max_length': u'标题最多为20个字符'},
- widget=forms.TextInput(attrs={'class': "form-control",
- 'placeholder': u'标题5-20个字符'}))
- memo = forms.CharField(required=False,
- max_length=,
- widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': }))
- phone = forms.CharField(validators=[mobile_validate, ],
- error_messages={'required': u'手机不能为空'},
- widget=forms.TextInput(attrs={'class': "form-control",
- 'placeholder': u'手机号码'}))
- email = forms.EmailField(required=False,
- error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
- widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))
Form
- def publish(request):
- ret = {'status': False, 'data': '', 'error': '', 'summary': ''}
- if request.method == 'POST':
- request_form = PublishForm(request.POST)
- if request_form.is_valid():
- request_dict = request_form.clean()
- print request_dict
- ret['status'] = True
- else:
- error_msg = request_form.errors.as_json()
- ret['error'] = json.loads(error_msg)
- return HttpResponse(json.dumps(ret))
Views
扩展:ModelForm
在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去Form中字段的定义
- class AdminModelForm(forms.ModelForm):
- class Meta:
- model = models.Admin
- #fields = '__all__'
- fields = ('username', 'email')
- widgets = {
- 'email' : forms.PasswordInput(attrs={'class':"wulaoer"}),
- }
Model
到目前位置,当我们的程序设计到数据库相关操作时,我们一般都会这么搞:
- 创建数据库,设计表结构和字段
- 使用MySQLdb来连接数据库,并编写数据库访问层代码
- 业务逻辑层去调用数据访问层执行数据库操作
- import MySQLdb
- def GetList(sql):
- db = MySQLdb.connect(user='root', db='wulaoer', passwd='', host='localhost')
- cursor = db.cursor()
- cursor.execute(sql)
- data = cursor.fetchall()
- db.close()
- return data
- def GetSingle(sql):
- db = MySQLdb.connect(user='root', db='wulaoer', passwd='', host='localhost')
- cursor = db.cursor()
- cursor.execute(sql)
- data = cursor.fetchone()
- db.close()
- return data
django中遵循Code Frist的原则,即:根据代码中定义的类来自动生成数据库表。
1、创建Mdoel,之后可以根据Model来创建数据库表
- from django.db import models
- class userinfo(models.Model):
- name = models.CharField(max_length=30)
- email = models.EmailField()
- memo = models.TextField()
- 、models.AutoField 自增列 = int()
- 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
- 、models.CharField 字符串字段
- 必须 max_length 参数
- 、models.BooleanField 布尔类型=tinyint()
- 不能为空,Blank=True
- 、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar
- 继承CharField,所以必须 max_lenght 参数
- 、models.DateField 日期类型 date
- 对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
- 、models.DateTimeField 日期类型 datetime
- 同DateField的参数
- 、models.Decimal 十进制小数类型 = decimal
- 必须指定整数位max_digits和小数位decimal_places
- 、models.EmailField 字符串类型(正则表达式邮箱) =varchar
- 对字符串进行正则表达式
- 、models.FloatField 浮点类型 = double
- 、models.IntegerField 整形
- 、models.BigIntegerField 长整形
- integer_field_ranges = {
- 'SmallIntegerField': (-, ),
- 'IntegerField': (-, ),
- 'BigIntegerField': (-, ),
- 'PositiveSmallIntegerField': (, ),
- 'PositiveIntegerField': (, ),
- }
- 、models.IPAddressField 字符串类型(ip4正则表达式)
- 、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的)
- 参数protocol可以是:both、ipv4、ipv6
- 验证时,会根据设置报错
- 、models.NullBooleanField 允许为空的布尔类型
- 、models.PositiveIntegerFiel 正Integer
- 、models.PositiveSmallIntegerField 正smallInteger
- 、models.SlugField 减号、下划线、字母、数字
- 、models.SmallIntegerField 数字
- 数据库中的字段有:tinyint、smallint、int、bigint
- 、models.TextField 字符串=longtext
- 、models.TimeField 时间 HH:MM[:ss[.uuuuuu]]
- 、models.URLField 字符串,地址正则表达式
- 、models.BinaryField 二进制
- 、models.ImageField 图片
- 、models.FilePathField 文件
更多字段
- 、null=True
- 数据库中字段是否可以为空
- 、blank=True
- django的 Admin 中添加数据时是否可允许空值
- 、primary_key = False
- 主键,对AutoField设置主键后,就会代替原来的自增 id 列
- 、auto_now 和 auto_now_add
- auto_now 自动创建---无论添加或修改,都是当前操作的时间
- auto_now_add 自动创建---永远是创建时的时间
- 、choices
- GENDER_CHOICE = (
- (u'M', u'Male'),
- (u'F', u'Female'),
- )
- gender = models.CharField(max_length=,choices = GENDER_CHOICE)
- 、max_length
- 、default 默认值
- 、verbose_name Admin中字段的显示名称
- 、name|db_column 数据库中的字段名称
- 、unique=True 不允许重复
- 、db_index = True 数据库索引
- 、editable=True 在Admin里是否可编辑
- 、error_messages=None 错误提示
- 、auto_created=False 自动创建
- 、help_text 在Admin中提示帮助信息
- 、validators=[]
- 、upload-to
更多参数
2、连表关系:
- 一对多,models.ForeignKey(ColorDic)
- 一对一,models.OneToOneField(OneModel)
- 多对多,authors = models.ManyToManyField(Author)
应用场景:
- 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)。
例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表在添加3列数据。
- 一对多,当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)。
例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
- 多对多:在某表中创建一行数据是,有一个可以多选的下拉框。
例如:创建用户信息,需要为用户指定多个爱好。
3、数据库操作
- 增加:创建实例,并调用sava
- 更新:a.获取实例,在sava;b.update(指定列)
- 删除:a.filter().delete();b.all().delete()
- 获取:a.单个=get(id=1);b,所有 = all()
- 过滤:filter(name='xxx');fileter(name__contains='');(id__in = [1,2,3]);
icontains(大小写无关的LIKE),startswith和endswith,还有range(SQLBETWEEN查询) ‘gt’, 'in', 'isnull', 'endswith', 'contains', 'it', 'startswith', 'lendswith', 'icontains', 'range', 'istartswith'
- 排序:order_by("name") =asc; order_by("-name")=desc
- 返回第n-m条:第n条[0];前两条[0:2]
- 指定映射:calues
- 数量:count()
- 聚合:from django.db.models import Min,Max,Sum objects.all().aggregate(Max('guest_id'))
- 原始SQL
- cursor = connection.cursor()
- cursor.execute('''SELECT DISTINCT first_name ROM people_person WHERE last_name = %s""", ['Lennon'])
- row = cursor.fetchone()
上传文件实例:
- class FileForm(forms.Form):
- ExcelFile = forms.FileField()
Form
- from django.db import models
- class UploadFile(models.Model):
- userid = models.CharField(max_length = )
- file = models.FileField(upload_to = './upload/')
- date = models.DateTimeField(auto_now_add=True)
Model
- def UploadFile(request):
- uf = AssetForm.FileForm(request.POST,request.FILES)
- if uf.is_valid():
- upload = models.UploadFile()
- upload.userid =
- upload.file = uf.cleaned_data['ExcelFile']
- upload.save()
- print upload.file
View
中间件
django中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。
在django项目的settings模块中,有一个MIDDLEWARE_CLASSES变量,其中每一个元素就是一个中间件,如下。
- MIDDLEWARE_CLASSES = (
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.common.CommonMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- 'django.middleware.clickjacking.XFrameOptionsMiddleware',
- 'wulaoer.middleware.auth.Authentication'
- )
与mange.py在同一目录下的文件夹wulaoer/middleware下的auth.py文件中的Authentication类
中间件中可以定义四个方法,分别是:
- process_request(self,request)
- process_view(self,request,exception)
- process_exception(self,request,exception)
- process_response(self,request,response)
以上方法的返回值跨越式None和HttpReson对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。
自定义中间件
1、创建中间件类
- class RequestExeute(object):
- def process_request(self,request):
- pass
- def process_view(self, request, callback, callback_args, callback_kwargs):
- i =1
- pass
- def process_exception(self, request, exception):
- pass
- def process_response(self, request, response):
- return response
2、注册中间件
- MIDDLEWARE_CLASSES = (
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.common.CommonMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- 'django.middleware.clickjacking.XFrameOptionsMiddleware',
- 'wulaoer.middleware.auth.RequestExeute',
- )
admin
django admin是django提供的一个后台管理页面,改管理页面提供完善的html和css,使得你在通过Model创建完数据库表之后,就可以对数据进行增删改查,而使用django admin则需要以下步骤:
- 创建后台管理员
- 配置url
- 注册和配置django admin后台管理页面
1、创建后台管理员
- python manage.py createsuperuser
2、配置后台管理url
- url(r'^admin/', include(admin.site.urls))
3、注册和配置django admin后台管理页面
a、在admin中执行如下配置
- from django.contrib import admin
- from app01 import models
- admin.site.register(models.UserType)
- admin.site.register(models.UserInfo)
- admin.site.register(models.UserGroup)
- admin.site.register(models.Asset)
b、设置数据表名称
- class UserType(models.Model):
- name = models.CharField(max_length=50)
- class Meta:
- verbose_name = '用户类型'
- verbose_name_plural = '用户类型'
c、打开表之后,设定默认显示,需要在model中作如下配置
- class UserType(models.Model):
- name = models.CharField(max_length=50)
- def __unicode__(self):
- return self.name
- from django.contrib import admin
- from app01 import models
- class UserInfoAdmin(admin.ModelAdmin):
- list_display = ('username', 'password', 'email')
- admin.site.register(models.UserType)
- admin.site.register(models.UserInfo,UserInfoAdmin)
- admin.site.register(models.UserGroup)
- admin.site.register(models.Asset)
d、为数据表添加搜索功能
- from django.contrib import admin
- from app01 import models
- class UserInfoAdmin(admin.ModelAdmin):
- list_display = ('username', 'password', 'email')
- search_fields = ('username', 'email')
- admin.site.register(models.UserType)
- admin.site.register(models.UserInfo,UserInfoAdmin)
- admin.site.register(models.UserGroup)
- admin.site.register(models.Asset)
e、添加快速过滤
- from django.contrib import admin
- from app01 import models
- class UserInfoAdmin(admin.ModelAdmin):
- list_display = ('username', 'password', 'email')
- search_fields = ('username', 'email')
- list_filter = ('username', 'email')
- admin.site.register(models.UserType)
- admin.site.register(models.UserInfo,UserInfoAdmin)
- admin.site.register(models.UserGroup)
- admin.site.register(models.Asset)
更多:http://docs.30c.org/djangobook2/chapter06/
Django: 之数据库完美解析的更多相关文章
- Django: 之数据库导入、迁移和联用
Django 数据库导入 从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库,应该如何操作呢? 以下操作符合 Django版本为 1.6 ,兼顾 Django 1 ...
- 让Django支持数据库长连接(可以提高不少性能哦)
书接上回 上回我们说到:<在生产系统使用Tornado WebServer来代替FastCGI加速你的Django应用> 那么现在很流行用一些高性能的nonblock的app server ...
- 第二章、Django以及数据库的配置
目录 第二章.Django以及数据库的配置 一.小白必会三板斧 二.静态文件配置 三.form表单 action和method参数可以写的形式 四.request对象及方法 五.django连接数据库 ...
- django 操作数据库--orm(object relation mapping)---models
思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...
- python学习笔记--Django入门三 Django 与数据库的交互:数据建模
把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...
- Django模型-数据库操作
前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...
- Django查询数据库性能优化
现在有一张记录用户信息的UserInfo数据表,表中记录了10个用户的姓名,呢称,年龄,工作等信息. models文件 from django.db import models class Job(m ...
- django模型——数据库(二)
模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...
- Linux下安装Python3的django并配置mysql作为django默认数据库(转载)
我的操作系统为centos6.5 1 首先选择django要使用什么数据库.django1.10默认数据库为sqlite3,本人想使用mysql数据库,但为了测试方便顺便要安装一下sqlite开发包 ...
随机推荐
- OpenStack回顾随笔(第一章)
1. OpenStack历史 OpenStack前身是NASA和Rackspace合作的项目,2010年开源,与其他主流开源云管理系统:Citrix的Cloudstack和桉树的OpenNebu ...
- COM与.NET程序集导出和部署COM组件
为了分布式和多客户端调用我们还需要将写好的COM组件发布到一台服务器上.这里我们将组件部署到操作系统的COM+应用程序中去.如果没此需要就可以导出后,在C++环境中调用COM了. 第一步:导出COM组 ...
- Objective-C 2.0属性(Property)介绍
通常在声明一些成员变量时会看到如下声明方式: @property (参数1,参数2) 类型 名字: 这里我们主要分析在括号中放入的参数,主要有以下三种: setter/getter方法(assign/ ...
- 向.net后端发送请求获取数据,在前端动态填充表格
实现效果 实现步骤 通过Ajax请求的方式 1.在前端定义Table 2.通过Ajax向.net后端发送数据请求 3.在.net后端定义方法供前端调用,并返回所需的数据 4.通过构造字符串的方式,将后 ...
- CocoaPods安装、卸载、使用说明(Mac ox 10.11+)
一.全新安装前,先检查是否有安装残留 由于Mac 10.11更改了安全机制,所以cocoapods得安装和卸载命令也有所改变, 1.如果之前装过cocopods,最好先卸载掉,卸载命令: $ sudo ...
- Jena 简介:通过 Jena Semantic Web Framework 在 Jave 应用程序中使用 RDF 模型
简介: RDF 越来越被认为是表示和处理半结构化数据的一种极好选择.本文中,Web 开发人员 Philip McCarthy 向您展示了如何使用 Jena Semantic Web Toolkit,以 ...
- 如何更改mysql可执行路径及更改mysql数据库文件路径
一.如何更改服务中MySQL的可执行文件路径: 解决方法:到注册表里HKEY_LOCAL_MECHINE---SYSTEM ---CurrentControlSet 更改查找一. MySQL项值,然后 ...
- JS总结之二:DOM对象控制HTML
DOM对象控制HTML 1.方法 getElementsByName( ) ——获取name getElementsByTagName( ) ——获取元素 getAttribute( ) ——获取元素 ...
- hdu_5787_K-wolf Number(数位DP)
题目链接:hdu_5787_K-wolf Number 题意: 给你一个区间,让你找满足任意k个数位内都没有相同的数字的个数 题解: 因为k不大,就直接将当前pos的前k-1个数传进去就行了 #inc ...
- css:cdata
javascript <![CDATA[的web标准使用方法 根据W3C XHTML 1.0的规定:在XHTML中,因为<和&这两个符号有特殊意义(小于号用于标签的开始标记), ...