django 迁移总结

生成迁移文件:1.进入虚拟环境 或 创建虚拟环境 mkvirtualenv cc / workon cc
2.安装django1.11的包 pip install django==1.11
3.创建项目 django-admin startproject 项目名称 例如:django-admin startproject test1
4.进入项目 创建应用:cd test1 python manage.py startapp booktest
5.安装应用 在setting文件中配置'booktest', 更改链接数据库MySQL的~~~
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test2', #数据库名字,
'USER': 'root', #数据库登录用户名
'PASSWORD': 'mysql', #数据库登录密码
'HOST': 'localhost', #数据库所在主机
'PORT': '3306', #数据库端口
}
}
配置中文LANGUAGE_CODE = 'zh-hans' #使用中国语言
TIME_ZONE = 'Asia/Shanghai' #使用中国上海时间
在mysql里面创建数据库 ,字符集是utf8 create database test2 charset=utf8;
6.运行文件 pyrhn manage.py runserver 默认IP是127.0.0.1,默认端口为8000 ,可以不写
7.在models.py中定义模型 from django.db import models
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)
bpub_date = models.DateField()
8. 在init文件中加上 import pymysql pymysql.install__as__MySQLdb()
9.下载pymysql pip install pymysql
10.生成迁移文件 python manage.py makemigrations
11.执行迁移文件 python manage.py migrate
进入脚本 python manage.py shell
导入booktest/models中的类:from booktest.models import BookInfo,HeroInfo
查询所有图书信息:BookInfo.objects.all()
新建图书对象:b=BookInfo()
b.btitle="射雕英雄传 "
from datetime import date
b.bpub_date=date(1991,1,31)
b.save()
再次查询所有图书信息:BookInfo.objects.all()
查找图书信息并查看值:b=BookInfo.objects.get(id=1)
b
b.id
b.btitle
创建管理员:python manage.py createsuperuser
启动服务器:python manage.py runserver
打开浏览器 ctrl + c,在地址栏中输入如下地址后回车 http://127.0.0.1:8000/admin/
视图:配置URLconf
查找视图的过程 请求者在浏览器地址栏中输入url,请求到网站后,获取url信息,然后与编写好的URLconf逐条匹配,如果匹配成功则调用对应的视图函数,如果所有的URLconf都没有匹配成功,则返回404错误。
一条URLconf包括url规则、视图两部分:1.url规则使用正则表达式定义。
2.视图就是在views.py中定义的视图函数。
需要两步完成URLconf配置:1.在应用中定义URLconf
2.包含到项目的URLconf中
在booktest/应用下创建urls.py文件,定义代码如下:from django.conf.urls import url
from booktest import views
urlpatterns = [
url(r'^$', views.index),
]
含到项目中:打开test1/urls.py文件,为urlpatterns列表增加项如下:url(r'^', include('booktest.urls')),test1/urls.py文件完整代码如下: from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('booktest.urls')),
创建模板: 设置查找模板的路径:打开test1/settings.py文件,设置TEMPLATES的DIRS值
'DIRS': [os.path.join(BASE_DIR, 'templates')],
定义模板:打开templtes/booktest/index.html文件,定义代码如下:
<html>
<head>
<title>图书列表</title>
</head>
<body>
<h1>{{title}}</h1>
{%for i in list%}
{{i}}

{%endfor%}
</body>
</html>
打开booktst/views.py文件,调用上面定义的模板文件
from django.http import HttpResponse
from django.template import loader
def index(request):

1.获取模板

template=loader.get_template('booktest/index.html')

2.定义上下文

context={'title':'图书列表','list':range(10)}

3.渲染模板

return HttpResponse(template.render(context))
视图调用模板简写:from django.shortcuts import render
def index(request):
context={'title':'图书列表','list':range(10)}
return render(request,'booktest/index.html',context)]
属性命名限制:1.不能是python的保留关键字。
2.不允许使用连续的下划线,这是由django的查询方式决定的,在后面会详细讲解查询。
3.定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:属性=models.字段类型(选项)
字段类型:使用时需要引入django.db.models包
1.AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。(必须填入参数primary_key=True)
2.BooleanField:布尔字段,值为True或False。
3.NullBooleanField:支持Null、True、False三种值。
4.CharField(max_length=字符长度):字符串。参数max_length表示最大字符个数。
5.TextField:大文本字段,一般超过4000个字符时使用。
6.IntegerField:整数。
7.DecimalField(max_digits=None, decimal_places=None):十进制浮点数。 1.参数max_digits表示总位数。2. 参数decimal_places表示小数位数。
8.FloatField:浮点数。
9.DateField[auto_now=False, auto_now_add=False]):日期。
10.TimeField:时间,参数同DateField。
11.DateTimeField:日期时间,参数同DateField。
12.FileField:上传文件字段。
选项: 1.null:如果为True,表示允许为空,默认值是False。
2.blank:如果为True,则该字段允许为空白,默认值是False。
3.对比:null是数据库范畴的概念,blank是表单验证范畴的。
4.db_column:字段的名称,如果未指定,则使用属性的名称。
5.db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
6.default:默认值。
7.primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
8.unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。
字段查询:
实现sql中where的功能,调用过滤器filter()、exclude()、get(),下面以filter()为例。
属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线。
属性名称__比较运算符=值
查询mysql数据库日志:
查看mysql数据库日志可以查看对数据库的操作记录。 mysql日志文件默认没有产生,需要做如下配置:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
把68,69行前面的#去除,然后保存并使用如下命令重启mysql服务。sudo service mysql restart
条件查询:

  1. 查询等: exact:表示判等 ==。
    例:查询编号为1的图书。
    list=BookInfo.objects.filter(id__exact=1) 或 list=BookInfo.objects.filter(id=1)
  2. 模糊查询 : contains:是否包含。
    例:查询书名包含'传'的图书。
    list = BookInfo.objects.filter(btitle__contains='传')
    startswith、endswith:以指定值开头或结尾。
    例:查询书名以'部'结尾的图书
    list = BookInfo.objects.filter(btitle__endswith='部')
    以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.
  3. 空查询 : isnull:是否为null。
    例:查询书名不为空的图书。
    list = BookInfo.objects.filter(btitle__isnull=False)
  4. 范围查询 : in:是否包含在范围内。
    例:查询编号为1或3或5的图书
    list = BookInfo.objects.filter(id__in=[1, 3, 5])
  5. 比较查询 : gt、gte、lt、lte:大于、大于等于、小于、小于等于。
    例:查询编号大于3的图书
    list = BookInfo.objects.filter(id__gt=3)
    不等于的运算符,使用exclude()过滤器。
    例:查询编号不等于3的图书
    list = BookInfo.objects.exclude(id=3)
  6. 日期查询 : year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
    例:查询1980年发表的图书。
    list = BookInfo.objects.filter(bpub_date__year=1980)
    例:查询1980年1月1日后发表的图书。
    list = BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
    F对象
    之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。
    语法如下:F(属性名)
    例:查询阅读量大于等于评论量的图书。
    from django.db.models import F
    list = BookInfo.objects.filter(bread__gte=F('bcomment'))
    可以在F对象上使用算数运算。
    例:查询阅读量大于2倍评论量的图书。
    list = BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
    Q对象
    多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
    例:查询阅读量大于20,并且编号小于3的图书。
    list=BookInfo.objects.filter(bread__gt=20,id__lt=3) 或 list=BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
    如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。
    语法如下:
    Q(属性名运算符=值)
    例:查询阅读量大于20的图书,改写为Q对象如下。
    from django.db.models import Q
    list = BookInfo.objects.filter(Q(bread__gt=20))
    Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
    例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
    list = BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
    Q对象前可以使用~操作符,表示非not。
    例:查询编号不等于3的图书。
    list = BookInfo.objects.filter(~Q(pk=3))
    聚合函数:
    使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中。
    例:查询图书的总阅读量 : from django.db.models import Sum list = BookInfo.objects.aggregate(Sum('bread'))
    注意aggregate的返回值是一个字典类型,格式如下
    {'聚合类小写
    属性名':值} 如:{'sum__bread':3}
    使用count时一般不使用aggregate()过滤器。
    例:查询图书总数。
    list = BookInfo.objects.count()
    注意count函数的返回值是一个数字。
    django 模型[查询集]
    什么是查询集(结果集):查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以 含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过滤器像where和limit子句。
    1 .返回查询集的过滤器如下:
    1.1 all():返回模型类对应表的所有数据,返回值是QuerySet类型
    1.2 filter():返回满足条件的数据,返回值是QuerySet类型,参数可以写查询条件
    1.3 exclude(): 返回满足条件之外的数据(即:不满足条件的数据),返回值是QuerySet类型,参数可以写查询条件
    提示:相当于sql语句中where部分的not关键字
    1.4 order_by(): 对结果进行排序,返回值是QuerySet类型,参数可以写排序中的字段
  1. 返回单个值的过滤器如下:
    2.1 get(): 返回单个满足条件的对象(有且只能有一条数据),参数可以是查询条件
    如果未找到会引发"模型类.DoesNotExist"异常。
    如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常。
    2.2 count():返回当前查询结果的总条数,返回值是一个数字.
    2.3 aggregate():进行聚合操作,返回一个字典。
    from django.db.models import Sum,Count,Avg,Max,Min
  2. 判断某一个查询集中是否有数据:
    exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
    二、查询集两大特性
    1、惰性查询
    惰性查询:只有在实际使用查询集中的数据的时候,才会发生对数据库的真正查询, 调用数据的情况包括迭代,序列化,与if合用
    示例:查询所有,编辑booktest/views.py的index视图,运行查看。
    list=BookInfo.objects.all()
    2、查询集的缓存
    当使用的是同一个查询集时,第一次的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果集
    演示: 运行项目shell : python manage.py shell
    三、限制查询集
    可以对一个查询集进行 取下标或切片 操作,等同于sql中的limit和offset子句。
    如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常。
    示例:获取第1、2项,运行查看。 list=BookInfo.objects.all()[0:2]
    django 模型[关联]:
    模型类关系
    关系字段类型
    关系型数据库的关系包括三种类型:
    ForeignKey:一对多,将字段定义在多的一端中。
    ManyToManyField:多对多,将字段定义在任意一端中。
    OneToOneField:一对一,将字段定义在任意一端中。
    可以维护递归的关联关系,使用'self'指定,详见"自关联"。
    一对多关系: 参见booktest应用中的BookInfo类和HeroInfo类。
    多对多关系:新闻类和新闻类型类,一个新闻类型下可以用很多条新闻,一条新闻也可能归属于多种新闻类型。
    关联查询:
    由一到多的访问语法: 一对应的模型类对象.多对应的模型类名小写set
    例:b = BookInfo.objects.get(id=1)
    b.heroinfo_set.all()
    由多到一的访问语法: 多对应的模型类对象.多对应的模型类中的关系类属性名
    例:h = HeroInfo.objects.get(id=1)
    h.hbook
    访问一对应的模型类关联对象的id语法: 多对应的模型类对象.关联类属性id
    例:h = HeroInfo.objects.get(id=1)
    h.book_id
    python manage.py shell
    由多模型类条件查询一模型类数据: 关联模型类名小写
    属性名条件运算符=值
    如果没有"
    运算符"部分,表示等于,结果和sql中的inner join相同。
    例:查询图书,要求图书中英雄的描述包含'八'。 list = BookInfo.objects.filter(heroinfo__hcontent__contains='八')
    由一模型类条件查询多模型类数据: 语法如下:一模型类关联属性名一模型类属性名条件运算符=值
    例:查询书名为“天龙八部”的所有英雄。 list = HeroInfo.objects.filter(hbook__btitle='天龙八部')
    自关联:自关联是一种特殊的一对多的关系
    打开booktest/views.py文件,定义视图area。
    from booktest.models import AreaInfo
    ...

查询广州市的信息

def area(request):
area = AreaInfo.objects.get(pk=440100)
return render(request, 'booktest/area.html', {'area': area})
打开booktest/urls.py文件,新建一条url。
urlpatterns = [
...
url(r'^area/$', views.area),
]
在templates/booktest目录下,新建area.html文件。
<html>
<head>
<title>地区</title>
</head>
<body>
当前地区:{{area.atitle}}



上级地区:{{area.aParent.atitle}}


下级地区:
<ul>
{%for a in area.areainfo_set.all%}
<li>{{a.atitle}}</li>
{%endfor%}
</ul>
</body>
</html>
运行服务器。
python manage.py runserver
14_django 模型[模型类扩展]
模型实例方法
1.str():在将对象转换成字符串时会被调用。
2.save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句。
3.delete():将模型对象从数据表中删除,ORM框架会转换成对应的delete语句。
模型类的属性
属性objects:管理器,是models.Manager类型的对象,用于与数据库进行交互。
当没有为模型类定义管理器时,Django会为每一个模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects。
为模型类BookInfo定义管理器books语法如下:
class BookInfo(models.Model):
books = models.Manager()
管理器Manager
管理器是Django的模型进行数据库操作的接口,Django应用的每个模型类都拥有至少一个管理器。Django支持自定义管理器类,继承自models.Manager。
自定义管理器类主要用于两种情况:
1.修改原始查询集,重写all()方法
2.向管理器类中添加额外的方法,如向数据库中插入数据。
元选项
在模型类中定义类Meta,用于设置元信息,如使用db_table自定义表的名字。
数据表的默认名称为:<app_name>_<model_name>例: booktest_bookinfo
视图
视图的功能:视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者。
使用视图的过程:视图就是一个python函数,被定义在"应用/views.py"文件中。 使用视图时需要进行两方面操作,两个操作不分先后。
视图就是python中的函数,视图一般被定义在"应用/views.py"文件中,此例中为"booktest/views.py"文件。视图必须返回一个HttpResponse对象或子对象作为响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误等。
视图的第一个参数必须为HttpRequest实例,还可能包含下参数如:
1.通过正则表达式组获得的关键字参数。
2.通过正则表达式组获取的位置参数。
17_django视图[HttpRequest]
HttpRequest对象
服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象就可以。视图的第一个参数必须是HttpRequest对象,在django.http模块中定义了HttpRequest对象的API。
属性
下面除非特别说明,属性都是只读的。
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
在浏览器中给出地址发出请求采用get方式,如超链接。
在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求。
encoding:一个字符串,表示提交的数据的编码方式。
如果为None则表示使用浏览器的默认设置,一般为utf-8。
这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
GET:QueryDict类型对象,类似于字典,包含get请求方式的所有参数。
POST:QueryDict类型对象,类似于字典,包含post请求方式的所有参数。
FILES:一个类似于字典的对象,包含所有的上传文件。
COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串。
session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见"状态保持"。

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

推荐阅读更多精彩内容